0

我有一个要求,比如我需要根据属性文件条目上定义的某个顺序对 Map 中的键进行排序。因此输出应该根据用户在属性条目上定义的顺序来。为此,我尝试使用TreeMapand Comparator

我的属性文件条目是

seq=People,Object,Environment,Message,Service

以下是我的代码:

Properties prop=new Properties();
prop.load(new FileInputStream("D:\\vignesh\\sample.properties"));
final String sequence=prop.getProperty("seq");
// Display elements
     final String sequence=prop.getProperty("seq");
     System.out.println("sequence got here is "+sequence); 
      //Defined Comparator
      Comparator<String> comparator = new Comparator<String>() {
          @Override
          public int compare(String key1, String key2) {
              return sequence.indexOf(key1) - sequence.indexOf(key2);
          }
      };
SortedMap<String,String> lhm = new TreeMap<String,String>(comparator);
       // Put elements to the map
          lhm.put("Object", "biu");
          lhm.put("Message", "nuios");
          lhm.put("Service", "sdfe");
          lhm.put("People", "dfdfh");
          lhm.put("Environment", "qwe");
          lhm.put("Other", "names");
          lhm.put("Elements", "ioup");          //Not showing in output
          lhm.put("Rand", "uiy");               //Not showing in output
//Iterating Map
      for(Entry<String, String> entry : lhm.entrySet()) {
            System.out.println(entry.getKey());
        }

输出

sequence got here is People,Object,Environment,Message,Service
Other
People
Object
Environment
Message
Service

现在我对这段代码有一些问题。

  • 我的地图中有近 8 个元素。但输出仅显示 6 个元素。为什么最后两个元素没有出现?

  • 与序列不匹配的值现在在顶部。
    我想在底部得到那些。有没有办法?

  • 在这里,我已经声明了从属性文件中读取的字符串,final这样我就不能每次都更改属性。当我
    删除最终标识符时,它在我的 IDE 中显示错误。我怎样才能
    避免这种情况?

  • 我在 HashMap 中的键可能不完全等于属性条目
    序列。所以我需要检查该序列是否包含在我的 HashMap 键中。我需要为此更改比较器吗?

4

2 回答 2

2

不是您的元素没有打印出来,而是它们没有添加到地图中!

在排序的地图中,您有:

排序映射使用其 compareTo(或比较)方法执行所有键比较,因此从排序映射的角度来看,此方法认为相等的两个键是相等的。

但是地图不能有两个相等的键:

地图不能包含重复的键;每个键最多可以映射到一个值。

但是当ElementOther你的比较器比较时返回零。它认为这两个字符串相等,因此不会将最新的字符串添加到地图中。

正如 javadoc 中所建议的那样SortedMap

请注意,如果有序映射要正确实现 Map 接口,则有序映射维护的排序(无论是否提供显式比较器)必须与 equals 一致。

因此,我建议您确保当比较器返回 0 时,这是因为比较的两个元素确实相等。一个非常“天真”的方法是:

Comparator<String> comparator = new Comparator<String>() {
      @Override
      public int compare(String key1, String key2) {
          int returned = sequence.indexOf(key1) - sequence.indexOf(key2);

          if (returned == 0 && !key1.equals(key2))
              returned = -1;

          return returned;

      }
  };
于 2013-09-06T08:47:24.370 回答
0

首先,indexOf返回-1它在 a 中找不到的任何子字符串String

当您插入"Other"时,indexOf("Other")返回-1indexOf("People")返回0,这将添加"Other"到地图的第一个位置。

但是,当添加其他字符串时,它们会针对"Other"返回进行测试-1。不幸的是,属性值字符串中也缺少所有其他元素,因此返回-1。这意味着sequence.indexOf(key1) - sequence.indexOf(key2)is0并且它们都被假定等于"Other"

于 2013-09-06T08:52:53.477 回答