簡體   English   中英

排序地圖 <String, Object> 通過IgnoreCase鍵?

[英]Sort Map<String, Object> by keys with IgnoreCase?

好吧,我測試了TreeMap,但它沒有考慮字符串比較中的IgnoreCase。 我需要按字典順序排序並忽略大小寫。 還有其他方法嗎?

謝謝,這是有效的(TreeMap(Comparator c))。 但是,我有另一個問題:

public final Comparator<Object> STR_IGN_CASE_COMP = new Comparator<Object>() {

    public int compare(Object h1, Object h2) {
            String s1 = h1.getId();
            String s2 = h2.getId();
            return s1.compareToIgnoreCase(s2);
    }
}; //STR_IGN_CASE_COMP

如何將比較器廣泛化以適應不同的對象? 假設所有人都有getId()方法。

謝謝,馬丁

您想在TreeMap構造函數中使用Comparator 特別是,請查看String.CASE_INSENSITIVE_ORDER

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER);

使用Collator或自定義Comparator可能會在非英語語言環境中更好地為您工作,或者如果您需要更復雜的排序。

最好的方法是使用Collat​​or。 collat​​or是一個內置類,它也實現了Comparable,因此您可以將它用於TreeMap。

使用collat​​or,您還可以控制比較的強度,例如,如果您想要對重音不敏感。

Collator stringCollator = Collator.getInstance();
stringCollator.setStrength(Collator.PRIMARY); 
new TreeMap<String, String>(stringCollator)

為它提供一個Comparator,用於比較被忽略的字符串。

TreeMap(比較器c)

如果您有一個列表,我會說使用Comparator嘗試Collections.sort()。 您可能必須使用String.equalsIgnoreCase()而不是equals()來滾動自己的Comparator。

public static <T> void sort(List<T> list,
                        Comparator<? super T> c)

但我走在正確的軌道上。 嘗試使用Comparator的TreeMap構造函數:

public TreeMap(Comparator<? super K> comparator)

是的,你想要的是使用帶有比較器的TreeMap構造函數。 制作一個使用compareToIgnoreCase的比較器。

我懷疑你應該使用自定義比較器構建你的TreeMap

import java.text.Collator;
import java.util.Comparator;

class IgnoreCaseComp implements Comparator<String> {
  Collator col;

  IgnoreCaseComp() {
    col = Collator.getInstance();

    col.setStrength(Collator.PRIMARY);
  }

  public int compare(String strA, String strB) {
    return col.compare(strA, strB);
  }
}

如何將比較器廣泛化以適應不同的對象? 假設所有人都有getId()方法。

您應該能夠使用BeanComparator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM