繁体   English   中英

使用已排序的Set对Hashmap的值进行排序

[英]Sorting a Hashmap's values with sorted Set

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

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

但它会按字母顺序排序,然后依次将所有值都放在(*)之前。 反正有什么可以扭转的???

您应该只为String定义一个自定义的Comparator,并在构建TreeSet时将其作为Comparator传入。 这是一个类似的StackOverflow问题,带有详细答案:

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

您尚未确切说明要使用星号做什么,但是下面是一个示例,该示例根据字符串是否包含星号进行排序。 请注意,我在这里使用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 ,如何将包含*的条目排在排序后的集合中。

您可以反转Treeset

 TreeSet<String> treeSetObj = new TreeSet<String>( Collections.reverseOrder() ) ;

您必须编写自己的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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM