Java 树映射未返回所有键
我有一个要求,就像我需要根据属性文件条目上定义的某个序列对映射中的键进行排序。这样,输出应该根据用户在属性条目上定义的序列来。为此,我尝试使用Java 树映射未返回所有键,java,hashmap,treemap,Java,Hashmap,Treemap,我有一个要求,就像我需要根据属性文件条目上定义的某个序列对映射中的键进行排序。这样,输出应该根据用户在属性条目上定义的序列来。为此,我尝试使用TreeMap和比较器 我的属性文件条目是 seq=People,Object,Environment,Message,Service 以下是我的代码: Properties prop=new Properties(); prop.load(new FileInputStream("D:\\vignesh\\sample.properties")); f
TreeMap
和比较器
我的属性文件条目是
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());
}
现在我对这段代码有一些问题
- 我的地图中有将近8个元素,但输出结果只显示了6个元素 元素。为什么最后两个元素没有出现
- 与序列不匹配的值位于顶部
现在。我想把它们放在底部。有办法吗 - 这里我声明了从属性文件读取的字符串
作为
,因此我不能每次都更改属性。当我final
删除在我的IDE中显示错误的最终标识符。我怎样才能
避免这种情况 - HashMap中的My键可能与属性项不完全相等
序列。所以我需要检查序列是否包含在我的 HashMap键。我需要为此更改比较器吗
- 不是你的元素没有打印出来,而是它们没有添加到地图中
在已排序的地图中,您有:
排序映射使用其compareTo(或compare)方法执行所有键比较,因此,从排序映射的角度来看,此方法认为相等的两个键是相等的
但贴图不能有两个相等的键:
地图不能包含重复的键;每个键最多可以映射到一个值
但当将
元素
与其他
进行比较时,比较器返回零。它将这两个字符串视为相等,因此不会将最新的字符串添加到映射中
如SortedMap
的javadoc所示:
注意,如果排序映射要正确实现映射接口,则排序映射维护的顺序(无论是否提供显式比较器)必须与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;
}
};
比较器比较器=新比较器(){
@凌驾
公共整数比较(字符串键1、字符串键2){
返回的int=sequence.indexOf(key1)-sequence.indexOf(key2);
if(返回==0&&!key1.equals(key2))
返回=-1;
返回;
}
};
首先,
indexOf
返回-1
它在字符串中找不到的任何子字符串
当您插入“其他”
,索引(“其他”)
返回-1
,索引(“人员”)
返回0
,这会将“其他”
添加到地图的第一个位置
但是,当添加其他字符串时,它们将根据“other”
进行测试,后者返回-1
。不幸的是,属性值字符串中也缺少所有其他元素,因此返回-1
。这意味着sequence.indexOf(key1)-sequence.indexOf(key2)
是0
,假设它们都等于“其他”
现在工作正常。有没有办法在地图中最后添加不相等的元素?因为这些元素排在第一位,所以您有一个排序列表,所以要在最后添加它们,它们必须是顺序中的最后一个。为了实现这一点,你必须改变你的比较器。你能在这方面帮我一下吗?它们都在开头,因为正如afk5min所说,当indexof()没有找到它返回的字符串-1时。因此,当进行减法运算时,它就像未结束字符串是“before”,因此它出现在地图的开头。所以必须说明,当indexof()返回-1时,将值更改为Integer.MAX\u值。但是,这真的很幼稚,您应该想一个更好的方法来实现Comparator。如果我的答案解决了你的问题,并提供信息,请考虑接受它。
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;
}
};