public class IntegerWordComparator implements Comparator<Integer[]> {
@Override
public int compare(Integer[] iw1, Integer[] iw2) {
int commonLength = Math.min(iw1.length, iw2.length);
for (int i = 0; i < commonLength; i++) {
if (iw1[i] > iw2[i]) {
return 1;
} else if (iw1[i] < iw2[i]) {
return -1;
}
}
if (iw1.length > iw2.length) {
return 1;
} else if (iw1.length < iw2.length) {
return -1;
} else {
return 0;
}
}
}
: Bu durumda Map<Integer[], Integer> map = new TreeMap<Integer[], Integer>(new IntegerWordComparator());
, IntegerWordComparator
IntegerWord
benzer bir şey (aşağıya bakınız) olacak ama Comparator
arayüzünün bir uygulama olarak
Orijinal cevap
Kullanım yerine dizinin List
ve HashMap
yerine TreeMap
:
Map<List<Integer>, Integer> map = new HashMap<List<Integer>, Integer>();
// add three items two of which are the same
map.put(Arrays.asList(new Integer[]{1, 2, 3}), 1);
map.put(Arrays.asList(new Integer[]{3, 4, 7}), 2);
map.put(Arrays.asList(new Integer[]{1, 2, 3}), 4);
// print the size
System.out.println(map.size()); // 2
sonra, sipariş görmezden anahtar olarak Set
kullanmak istiyorsanız
. Eğer gerçekten TreeMap
kullanmak istiyorsanız ve dizilerinizi sözlüksel olarak karşılaştırmak istiyorsanız, kendi sınıfınızı yazıp anahtar olarak kullanabilirsiniz. İşte bir örnek:
public class IntegerWord implements Comparable<IntegerWord> {
protected final Integer[] integers;
public IntegerWord(Integer... integers) {
this.integers = integers;
}
@Override
public int compareTo(IntegerWord other) {
int commonLength = Math.min(integers.length, other.integers.length);
for (int i = 0; i < commonLength; i++) {
if (integers[i] > other.integers[i]) {
return 1;
} else if (integers[i] < other.integers[i]) {
return -1;
}
}
if (integers.length > other.integers.length) {
return 1;
} else if (integers.length < other.integers.length) {
return -1;
} else {
return 0;
}
}
@Override
public boolean equals(Object other) {
if (other instanceof IntegerWord) {
return (compareTo((IntegerWord)other) == 0);
} else {
return false;
}
}
@Override
public String toString() {
return Arrays.asList(integers).toString();
}
}
Kullanımı:
Map<IntegerWord, Integer> map = new TreeMap<IntegerWord, Integer>();
map.put(new IntegerWord(2, 5), 11);
map.put(new IntegerWord(1, 2, 3), 22);
map.put(new IntegerWord(1, 2, 3, 4), 33);
map.put(new IntegerWord(1, 2, 3), 44); // 1, 2, 3 again!
map.put(new IntegerWord(3, 9, 3, 4), 55);
map.put(new IntegerWord(0, 1), 66);
map.put(new IntegerWord(), 77); // will be the first!
System.out.println(map);
'u uygulayabilirsiniz. TreeMap, Karşılaştırılabilir olması için kendi anahtarlarını gerektirir. Ya da bir Karşılaştırıcı sağlamanız gerekir. Özel durumun hata iletisi size bunu söylemelidir. Onu okudun mu? TreeMap'in javadoc'unu okudun mu? –
Veya Karşılaştırma tuşları gerektirmeyen HashMap'i kullanın. Bir dizinin, aynı içeriğe sahip diğer dizilere değil, yalnızca kendisine eşit olarak kabul edileceğini unutmayın. –
Anahtar olarak kullanmak için kendi nesne sınıfınızı yazın. Bu şekilde, nesne sınıfınız Karşılaştırılabilir'i uygulayabilir. –