Java 如何对地图进行排序
我有一张地图要分类如下:Java 如何对地图进行排序,java,string,sorting,map,compare,Java,String,Sorting,Map,Compare,我有一张地图要分类如下: Map<String, String> map = new HashMap(); 它包含以下字符串值: String value = "value1.value2" 其中,键和值可以根据其点段的数量从键1/value1到键1.key2.key3.key4.key5/value1.value2.value3.value4.value5非均匀变化 我需要根据键中存在的点数或调用方法类型键/值中存在的点数对它们进行比较: 或 当然,这些方法将返回一个已排序的
Map<String, String> map = new HashMap();
它包含以下字符串值:
String value = "value1.value2"
其中,键和值可以根据其点段的数量从键1/value1到键1.key2.key3.key4.key5/value1.value2.value3.value4.value5非均匀变化
我需要根据键中存在的点数或调用方法类型键/值中存在的点数对它们进行比较:
或
当然,这些方法将返回一个已排序的映射
任何帮助都将不胜感激。对于初学者,您需要使用SortedMap的实例。如果映射没有实现该接口,那么它有一个未定义/任意的迭代顺序,您无法控制它。通常情况就是这样,因为映射是将值与键关联的一种方式;订购是一个辅助问题 所以我假设您正在使用,这是规范的排序映射实现。这将根据您可以在构造函数中提供的值对其键进行排序。因此,如果您可以编写这样一个比较器来确定任意两个键中的较低者:可以,这将很容易实现 但是,这仅在按键排序时起作用。我不知道按值对地图排序是否有意义,我也不知道有什么简单的方法可以做到这一点。我能想到的最好方法是编写一个比较器,对值进行排序,调用Map.getEntrySet并将所有条目推送到一个列表中,然后在列表中调用Collections.sort。它不是很优雅或高效,但如果性能不是你最关心的,它应该完成工作
还要注意的是,如果您的密钥不是不可变的,您将遇到很多麻烦,因为当外部更改时,它们不会被重新调用。对于初学者,您需要使用SortedMap的实例。如果映射没有实现该接口,那么它有一个未定义/任意的迭代顺序,您无法控制它。通常情况就是这样,因为映射是将值与键关联的一种方式;订购是一个辅助问题 所以我假设您正在使用,这是规范的排序映射实现。这将根据您可以在构造函数中提供的值对其键进行排序。因此,如果您可以编写这样一个比较器来确定任意两个键中的较低者:可以,这将很容易实现 但是,这仅在按键排序时起作用。我不知道按值对地图排序是否有意义,我也不知道有什么简单的方法可以做到这一点。我能想到的最好方法是编写一个比较器,对值进行排序,调用Map.getEntrySet并将所有条目推送到一个列表中,然后在列表中调用Collections.sort。它不是很优雅或高效,但如果性能不是你最关心的,它应该完成工作
还要注意,如果您的键不是不可变的,您将遇到很多麻烦,因为它们在外部更改时不会被重新调用。您应该使用树形图并实现ValueComparator,或者使实现的键和值对象具有可比性 这里一定是复制品
编辑:复制以仅命名一个您应该使用树形图并实现ValueComparator,或者使实现可比较的键和值对象 这里一定是复制品
编辑:重复命名一个无法在HashMap上强加任何排序 如果要通过比较键对元素进行排序,请在键上使用a和some,或者只使用它们的默认排序
如果要按值排序,唯一的实际选择是使用LinkedHashMap,它保留条目放入映射的顺序,然后在将条目插入映射之前对条目进行排序,或者使用一些非JDK映射实现。有一些肮脏的黑客使得一个键比较器实际上秘密地比较了值,但这些都是危险的,并且经常导致不可预测的行为。没有办法在HashMap上强加任何排序 如果要通过比较键对元素进行排序,请在键上使用a和some,或者只使用它们的默认排序
如果要按值排序,唯一的实际选择是使用LinkedHashMap,它保留条目放入映射的顺序,然后在将条目插入映射之前对条目进行排序,或者使用一些非JDK映射实现。有一些卑鄙的黑客使得一个密钥比较器实际上秘密地比较了值,但这些都是危险的,并且经常导致不可预测的行为。我是通过以下方法实现的:
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map sortMap(Map unsortedMap) {
List list = new LinkedList(unsortedMap.entrySet());
// sort list based on comparator
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
String value1 = (String)((Map.Entry) (o1)).getValue();
String value2 = (String)((Map.Entry) (o2)).getValue();
// declare the count
int count1 = findOccurances(value1, '.');
int count2 = findOccurances(value2, '.');
// Go to thru the comparing
if(count1 > count2){
return -1;
}
if(count1 < count2){
return 1;
}
return 0;
}
});
// put the sorted list into map again
Map sortedMap = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
使用以下帮助器方法:
private static int findOccurances(String s, char chr) {
final char[] chars = s.toCharArray();
int count = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == chr) {
count++;
}
}
return count;
}
在这里,我可以在比较部分加上一个int参数,在asc/desc之间进行切换
我可以通过切换另一个int参数值在值和键之间进行切换,以获得答案。我通过以下方法实现了这一点:
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map sortMap(Map unsortedMap) {
List list = new LinkedList(unsortedMap.entrySet());
// sort list based on comparator
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
String value1 = (String)((Map.Entry) (o1)).getValue();
String value2 = (String)((Map.Entry) (o2)).getValue();
// declare the count
int count1 = findOccurances(value1, '.');
int count2 = findOccurances(value2, '.');
// Go to thru the comparing
if(count1 > count2){
return -1;
}
if(count1 < count2){
return 1;
}
return 0;
}
});
// put the sorted list into map again
Map sortedMap = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
W
使用以下帮助器方法:
private static int findOccurances(String s, char chr) {
final char[] chars = s.toCharArray();
int count = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == chr) {
count++;
}
}
return count;
}
在这里,我可以在比较部分加上一个int参数,在asc/desc之间进行切换
我可以通过切换另一个int参数值在值和键之间进行更改以获得答案。映射是一个关联容器,谈论对其进行排序是没有意义的…您的方法的预期返回类型是什么?已经有一个关于它的线程:但没有可接受的答案,所以我在这里发布了我的来获取答案一个映射是一个关联容器,谈论排序是没有意义的…你的方法的预期返回类型是什么?已经有一个关于它的线程:但是没有被接受的答案,所以我在这里发布了我的来获取答案
private static int findOccurances(String s, char chr) {
final char[] chars = s.toCharArray();
int count = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == chr) {
count++;
}
}
return count;
}