0

我有一个包含和不包含星号 (* ) 的值的哈希图。我想对我的值进行排序,以便所有带有 (* ) 的值都排在最后。我尝试使用这行代码:

    SortedSet<String> orderedValues = new TreeSet<String>(myHashMap.values());

但它会按字母顺序排序,然后将所有值都放在 (*) 前面。反正有没有扭转它???

4

3 回答 3

1

您应该为字符串定义一个自定义比较器,并在构建 TreeSet 时将其作为比较器传递。这是一个类似的 StackOverflow 问题,有详细的答案:

TreeSet 自定义比较器算法 .. 字符串比较

您还没有具体说明您对星号所做的操作,但下面是一个示例,该示例根据字符串是否包含星号进行排序。请注意,我在List<String>这里使用 a 而不是 a HashMap。您从 a 获取值这一事实实际上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,对于使用 custom 的输出,Comparator包括 an 在内的条目*如何排在排序集中的最后。

于 2013-07-25T15:47:22.040 回答
0

你可以扭转你的Treeset

 TreeSet<String> treeSetObj = new TreeSet<String>( Collections.reverseOrder() ) ;
于 2013-07-25T15:48:37.937 回答
-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());
于 2013-07-25T15:54:56.140 回答