EDIT: La firma del metodoCome utilizzare HashSet per trovare elementi comuni in due matrici comparabili?
public Comparable[][] findCommonElements(Comparable[][] collections)
è sbagliato. Dovrebbe essere
public Comparable[] findCommonElements(Comparable[][] collections)
ma cambiarlo nel mio IDE incasina tutto. Ho quasi la sensazione di essere andato oltre le mie conoscenze perché non capisco completamente gli Insiemi, e l'array 2D mi sta rovinando molto.
sono tenuto a scrivere un algoritmo che prende due paragonabili array, itera attraverso di loro con efficienza temporale lineare, e visualizza gli elementi comuni. Ho letto che l'utilizzo di un HashSet mi ha dato l'efficienza temporale più veloce, ma ho raggiunto un punto morto. Ecco perché:
Ci hanno dato le istruzioni, e una singola linea di codice, che è la firma del metodo
public Comparable[][] findCommonElements(Comparable[][] collections)
che significa che devo restituire l'array 2d, "collezioni". Ho mandato via email il mio prof utilizzando HashSets e mi è stato dato il via libera, tranne che ho questo problema:
"È possibile utilizzare HashSet all'interno del metodo findCommonElements, ma sarà necessario poter contare il numero di confronti Sebbene l'hashing sia in genere molto efficiente, alcuni confronti verranno effettuati in caso di collisioni, per cui è necessario avere accesso al codice sorgente per l'HashSet che si utilizza. È inoltre necessario un metodo "getComparisons()" in la classe CommonElements per restituire il numero di confronti. "
In due semestri di programmazione, non ho imparato HashSet, Maps, Tabelle, ecc. Sto cercando di impararlo da solo, e non capisco completamente le collisioni.
Il mio codice accetta i due array e restituisce gli elementi comuni, ma la mia dichiarazione di ritorno è fasulla poiché in pratica l'ho scritta in modo da compilare (la matrice 2d Comparable è il parametro).
Sono sulla buona strada con questo? Ecco il codice:
public class CommonElements {
static Comparable[] collection1 = {"A", "B", "C", "D", "E"}; //first array
static Comparable[] collection2 = {"A", "B", "C", "D", "E", "F", "G"}; //second array
static Comparable[][] collections = {collection1, collection2}; //array to store common elements.
static Set<Comparable> commonStuff = new HashSet<>(); //instance of Set containing common elements
public static void main(String[] args) {
CommonElements commonElements = new CommonElements(); //create instance of class CommonElements
commonElements.findCommonElements(collections); //call the find method
}
public Comparable[][] findCommonElements(Comparable[][] collections) {
Set<Comparable> addSet = new HashSet<>(); //instance of Set to add elements to
for (Comparable x : collection1) { //adding elements from first array to my addSet
addSet.add(x);
}
for (Comparable x : collection2) {
if (addSet.contains(x)) {
commonStuff.add(x); //checking for common elements, add to commonStuff Set
}
}
System.out.println(toString(commonStuff)); //print the toString method
return collections; //return statement, otherwise Java will whine at me
}
public String toString(Set<Comparable> commonStuff) { //this method gets rid of the brackets
String elements = commonStuff.toString(); //make a String and assign it to the Set
elements = elements.replaceAll("\\[", "").replaceAll("\\]", ""); //replace both brackets with empty space
return "Common Elements: " + elements; //return the Set as a new String
}
}
In primo luogo, 'Comparable' è ** ** generica quindi si utilizza il rawtype - ** non **. Secondo, 'HashSet' confronta su' equals' - 'TreeSet' confronta usando' Comparable'. Usa uno di quelli. –
Grazie per il suggerimento, tuttavia, dopo aver letto [questo] (http://stackoverflow.com/questions/1463284/hashset-vs-treeset) mi dice che gli hashset sono più veloci nel tempo. ?? – IRGeekSauce
Lo sono, ma funzionano solo se si dispone di una funzione hash. Il fatto che tu abbia 'Comparables' mi fa dubitare che non sia solo l'implementazione' Object.hashCode() '. –