簡體   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