订购带有自定义比较器的 TreeMap,例如 Excel 坐标顺序
Order a TreeMap with custom comparator like Excel coordinate order
我正在使用 TreeMap
及其 subMap
来管理 Excel 文件。
我使用 Excel 坐标作为键。
在 Excel 中,顺序类似于 A
、B
、C
、...、AA
、AB
、AC
, ..., BA
... 但是我的顺序是 A
, AA
, AAA
, AB
, ... , B
.
我认为解决方案是使用自定义比较器,但我不知道如何使其获得 Excel 字母顺序。
Comparator<String> excelOrder= new Comparator<String>() {
@Override public int compare(String s1, String s2) {
//make order
}
};
然后使用
SortedMap<String,String> map = new TreeMap<String,String>(secondCharComparator);
首先,您要比较字符串的长度(使用 String.length()
) and then lexicographically (this is exactly what's done by default with String.compareTo(other)
)。以下内容正是这样做的:
Comparator<String> excelOrder = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int s1Length = s1.length();
int s2Length = s2.length();
if (s1Length < s2Length) {
return -1;
} else if (s1Length > s2Length) {
return 1;
} else {
return s1.compareTo(s2);
}
}
};
注意,如果你使用的是Java8,这可以写得更简单(此代码使用以下静态导入import static java.util.Comparator.comparingInt;
):
Comparator<String> excelOrder = comparingInt(String::length).thenComparing(String::compareTo);
我正在使用 TreeMap
及其 subMap
来管理 Excel 文件。
我使用 Excel 坐标作为键。
在 Excel 中,顺序类似于 A
、B
、C
、...、AA
、AB
、AC
, ..., BA
... 但是我的顺序是 A
, AA
, AAA
, AB
, ... , B
.
我认为解决方案是使用自定义比较器,但我不知道如何使其获得 Excel 字母顺序。
Comparator<String> excelOrder= new Comparator<String>() {
@Override public int compare(String s1, String s2) {
//make order
}
};
然后使用
SortedMap<String,String> map = new TreeMap<String,String>(secondCharComparator);
首先,您要比较字符串的长度(使用 String.length()
) and then lexicographically (this is exactly what's done by default with String.compareTo(other)
)。以下内容正是这样做的:
Comparator<String> excelOrder = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int s1Length = s1.length();
int s2Length = s2.length();
if (s1Length < s2Length) {
return -1;
} else if (s1Length > s2Length) {
return 1;
} else {
return s1.compareTo(s2);
}
}
};
注意,如果你使用的是Java8,这可以写得更简单(此代码使用以下静态导入import static java.util.Comparator.comparingInt;
):
Comparator<String> excelOrder = comparingInt(String::length).thenComparing(String::compareTo);