类似的问题请参阅:How to make HashMap work with Arrays as key?
但我需要像((int key1, int key2) -> String)
这样的TreeMap,比较key1
然后比较key2
。
我的解决方案是:
Map<int[], String> map = new TreeMap<>(Comparator.
<int[]>comparingInt(key -> key[0]).thenComparingInt(key -> key[1]));
但是当我需要((int key1, int key2, int key3) -> String
时,我必须写更多。
有没有办法为任意长度的数组生成比较器?
答案 0 :(得分:10)
从java-9开始,这可以通过以下方式大大简化:
TreeMap<int[], String> map = new TreeMap<>(Arrays::compare);
答案 1 :(得分:6)
带循环的比较器应该可以解决问题。如果我理解你的要求,那就是这样的。我应该提到它假设所有键都具有相同的长度。
Map<int[], String> treeMap = new TreeMap<>((o1, o2) -> {
for (int i = 0; i < o1.length; i++) {
if (o1[i] > o2[i]) {
return 1;
} else if (o1[i] < o2[i]) {
return -1;
}
}
return 0;
});
答案 2 :(得分:1)
你可以创建一个工厂方法,它创建一个比较器,比较数组的长度及其值:
public static Comparator<int[]> intArrayComparator(){
return ( left, right ) -> {
int comparedLength = Integer.compare(left.length, right.length);
if(comparedLength == 0){
for( int i = 0; i < left.length; i++ ){
int comparedValue = Integer.compare(left[i], right[i]);
if(comparedValue != 0){
return comparedValue;
}
}
return 0;
} else {
return comparedLength;
}
};
}
您可以像下面这样打电话:
Map<int[], String> treeMap = new TreeMap<>(intArrayComparator());
以上比较器有以下情况:
1
-1
1
-1
0
;