我有一个散列图,其值包含和不包含星号(*)。我想对我的值进行排序,以便带有(*)的所有值都是最后的。我尝试使用这行代码:
SortedSet<String> orderedValues = new TreeSet<String>(myHashMap.values());
但它按字母顺序排序,然后使用首先放置所有值(*)。无论如何要反过来???
答案 0 :(得分:1)
您应该只为字符串定义一个自定义Comparator,并在构建TreeSet时将其作为Comparator传递。这是一个类似的StackOverflow问题,详细解答如下:
TreeSet Custom Comparator Algo .. String Comparision
您尚未准确指定使用星号进行的操作,但下面是根据字符串是否包含星号进行排序的示例。请注意,我在此使用List<String>
而不是HashMap
。您从HashMap
获取值的事实并不重要 - 您可以对任何Java Collection
执行相同的操作。
List<String> strs = Arrays.asList("a","b","c","a*","b*");
Comparator<String> starCompare = new Comparator<String>() {
@Override public int compare(String a, String b) {
int aStar = a.contains("*") ? 1 : 0;
int bStar = b.contains("*") ? 1 : 0;
return (aStar != bStar)
? Integer.compare(aStar, bStar)
: a.compareTo(b);
}
};
// Without comparator
SortedSet<String> set1 = new TreeSet<String>(strs);
System.out.println(set1); // => [a, a*, b, b*, c]
// With comparator
SortedSet<String> set2 = new TreeSet<String>(starCompare);
set2.addAll(strs);
System.out.println(set2); // => [a, b, c, a*, b*]
请注意,set2
的输出使用自定义Comparator
,包含*
的条目在排序集中的最后位置。
答案 1 :(得分:0)
您可以撤销Treeset
TreeSet<String> treeSetObj = new TreeSet<String>( Collections.reverseOrder() ) ;
答案 2 :(得分:-2)
您必须编写自己的java.util.Comparator
来进行自定义排序。默认字符串排序是按字母顺序排列的。
编辑以满足对没有星号进行分组排序的新要求,然后全部用1然后全部用2等
如果你想按星号分组排序,然后全部用1然后全部用2等,然后在每个分组内,按字母顺序排序,那么你可能想要这样的东西:
public class AsterisksLast implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
int numAsterisksInO1 = numberOfAsterisksIn(o1);
int numAsterisksInO2 = numberOfAsterisksIn(o2);
if(numAsterisksInO1 == numAsterisksInO2){
//both contain same number of asterisks
//(which may be 0)
//sort
//alphabetically
return o1.compareTo(o2);
}
//different number of asterisks sort by fewest
return Integer.compare(numAsterisksInO1, numAsterisksInO2);
}
private int numberOfAsterisksIn(String s){
char[] chars =s.toCharArray();
int count=0;
for(int i=0; i<chars.length; i++){
if(chars[i] == '*'){
count++;
}
}
return count;
}
}
然后你需要把它交给你的TreeSet
SortedSet<String> orderedValues = new TreeSet<String>(new AsterisksLast());
orderedValues.addAll(myHashMap.values());