我的输入 -
List<String> parameterNames => [value0, type1, type0, name1, value1, name0]
我使用Collections.Sort
Collections.sort(parameterNames)
我得到了这样的答案
[name0, name1, type0, type1, value0, value1]
我想排序并获得这样的列表
[name0,type0,value0,name1,type1,value1]
我能用Java做到这一点吗?
答案 0 :(得分:8)
编写自定义Comparator,并将其实例传递给sort
方法:
Comparator<String> myComparator = new Comparator<String>() {
public int compare(String str1, String str2) {
// get the number at the end, and compare on the basis of that number
// And then do the string comparison on substring before number
}
};
Collections.sort(parameterNames, myComparator);
答案 1 :(得分:0)
当您使用Collections.sort()时,您可以传递Comparator来实现自定义方法,以检查搜索顺序中哪些更高,哪些更低。
答案 2 :(得分:0)
最好使用自定义Comparator
界面。如果您在使用Comparator
时遇到问题,请尝试使用以下代码:
List<String> revList= new ArrayList<>();
List<String> parameterNames=..//[value0, type1, type0, name1, value1, name0]
for (String string : parameterNames) {
revList.add(new StringBuilder(string).reverse().toString());//reverse the word
}
Collections.sort(revList);// Sort reverse word.
for (String string : revList) {
System.out.println(new StringBuilder(string).reverse().toString());
// Again reverse to get desired output.
}
输出: name0,type0,value0,name1,type1,value1
答案 3 :(得分:0)
您需要使用此逻辑实现自己的Comparator。
假设您的所有值都是stringNUMBER
格式,这里有一个实现镜头:
/**
* Compares two {@link String}s of the format stringNUMBER. Assumption: There is a single numeric part to the string,
* always at the end.
*/
public class TrailingNumberComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int cmp = o1.substring(getStrartNumberIndex(o1)).compareTo(o2.substring(getStrartNumberIndex(o2)));
if (cmp != 0) {
return cmp;
}
return o1.compareTo(o2);
}
private static int getStrartNumberIndex(String s) {
for (int i = 0; i < s.length(); ++i) {
if (Character.isDigit(s.charAt(i))) {
return i;
}
}
return s.length();
}
}
然后,您就可以致电Collections.sort(parameterNames, new TrailingNumberComparator())
;