【问题标题】:Sort Map<String, Object> by keys with IgnoreCase?使用 IgnoreCase 按键对 Map<String, Object> 进行排序?
【发布时间】:2009-11-07 01:25:11
【问题描述】:

好吧,我测试了 TreeMap,但它没有考虑字符串比较时的 IgnoreCase。我需要按字典顺序排序并忽略大小写。有没有其他办法?

谢谢,这行得通(TreeMap(比较器 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() 方法。

谢谢, 马丁

【问题讨论】:

  • Martin,完全改变问题不是一个好主意。下一个有权这样做的用户(也许是您)应该将其恢复到之前的状态。只需发布一个新问题!
  • +1,同意,当有人为您的问题提供答案时,您应该接受答案并在出现新问题时继续处理。
  • 问题似乎再次“向前滚动”,问题不再与任何答案匹配。

标签: java sorting collections string-comparison treemap


【解决方案1】:

您想在TreeMap constructor 中使用Comparator。特别是看String.CASE_INSENSITIVE_ORDER

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER);

使用Collator 或自定义Comparator 可能更适合您在非英语语言环境中或如果您需要更复杂的排序。

【讨论】:

  • 请记住 - 如果您是一名英语程序员,并且您可以控制键,那么您不需要担心区域设置,因为不会进行比较在值上完成,它们在键上完成;-)
【解决方案2】:

最好的方法是使用 Collat​​or。 collat​​or 是一个内置类,它也实现了 Comparable,因此您可以将它用于您的 TreeMap。

使用整理器,您还可以控制比较的强度,例如,如果您也想不区分重音。

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

【讨论】:

    【解决方案3】:

    为它提供一个比较忽略大小写的字符串的比较器。

    TreeMap(比较器 c)

    【讨论】:

      【解决方案4】:

      如何使比较器通用化 处理不同的对象? 假设都有 getId() 方法。

      您应该可以使用BeanComparator

      【讨论】:

      • 我建议将问题恢复为原始问题并发布新问题;如果发生这种情况,这个答案可能也应该被删除。
      【解决方案5】:

      如果你有一个列表,我会说试试 Collections.sort() 和一个比较器。您可能必须推出自己的使用 String.equalsIgnoreCase() 而不是 equals() 的比较器。

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

      但我是在正确的轨道上。尝试使用 Comparator 的 TreeMap 构造函数:

      public TreeMap(Comparator<? super K> comparator)
      

      【讨论】:

        【解决方案6】:

        是的,您想要的是使用带有 Comparator 的 TreeMap 构造函数。制作一个使用 compareToIgnoreCase 的比较器。

        【讨论】:

          【解决方案7】:

          我怀疑您应该使用自定义比较器构建您的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);
            }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-26
            • 2021-05-09
            • 1970-01-01
            • 1970-01-01
            • 2021-04-29
            • 1970-01-01
            • 2021-05-11
            相关资源
            最近更新 更多