我有这段代码:
HashMap<String, String[]> unsorted = new HashMap<String, String[]>();
String[] values = new String[3];
String key;
//add data to hashmap
key = "abc";
values[0] = "a"; values[1]="b"; values[2]="c";
unsorted.put(key, values);
key = "abc";
values[0] = "aa"; values[1]="bb"; values[2]="cb";
unsorted.put(key, values);
key = "def";
values[0] = "d"; values[1]="e"; values[2]="f";
unsorted.put(key, values);
//sort hashmap
/***********/
//output should be:
{ abc-[a,b,c], abc-[aa,bb,cc], def-[d,e,f] }
//or
{ abc-[aa,bb,cc], abc-[a,b,c], def-[d,e,f] }
我怎么能这样排序?注意:我尝试使用TreeMap和其他示例,但它们消除了键相等的元素。
编辑:我解决了我的问题:)感谢Guillaume。这是我使用的:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class test {
public static void main(String[] args) {
ArrayList<CustomObject> objs = new ArrayList<CustomObject>();
objs.add(new CustomObject("abc", new String[] {"a", "b", "c"}));
objs.add(new CustomObject("def", new String[] {"d", "e", "f"}));
objs.add(new CustomObject("abc", new String[] {"aa", "bb", "cc"}));
System.out.println(objs.isEmpty());
Collections.sort(objs, new Comparator<CustomObject>() {
@Override
public int compare(CustomObject o1, CustomObject o2) {
int i = o1.getKey().compareTo(o2.getKey());
if(i == 0)
return -1;
return i;
}
});
for(int i=0; i<objs.size(); i++)
System.out.println("key/value pair:" + objs.get(i).getKey() + " - " + objs.get(i).getValues()[0]);
}
}
CustomObject:
public class CustomObject {
private String key;
private String[] values;
public CustomObject(String key, String[] values) {
this.key = key;
this.values = values;
}
public String getKey() {
return key;
}
public String[] getValues() {
return values;
}
}
答案 0 :(得分:5)
如果您需要特殊排序,并且能够拥有具有相同“关键字”的多个对象,则会使用自定义List
为Comparator
尖叫。
1-定义要存储在列表中的一类元素。在您的情况下,它是一个具有2个字段的对象:“键”和String数组。我们称之为CustomObject
(您可以随意调用它)
2-将所有对象粘贴在列表中
就像那样:
list.add(new CustomObject("abc", new String[] {"a", "b", "c"});
list.add(new CustomObject("abc", new String[] {"aa", "bb", "cc"});
list.add(new CustomObject("def", new String[] {"d", "e", "f"});
3-使用自定义比较器订购列表。
要订购清单
Collections.sort(list, new Comparator<CustomObject>() {
@Override
public int compare(CustomObject o1, CustomObject o2) {
return o1.getArray().compare(o2.getArray());
}
});
(你的比较器需要更复杂,才能正确比较数组,但你明白我的观点)。
另一种方法是为CustomObject
添加自然排序(实现Comparable
),并将其添加到TreeSet
。
答案 1 :(得分:2)
HashMap无法排序(或包含重复的键),它是如何实现(see the documentation)的一部分。
此课程不保证地图的顺序;在 特别是,它不保证订单将保持不变 随着时间的推移。
所以你最好像其他人一样建议并切换到列表或不同的地图实现。
答案 2 :(得分:0)
您需要使用允许重复键的Map,JDK中没有这样的Map。尝试在Google番石榴中使用Multimap。 http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multimap.html
具有自然顺序的实现是TreeMultiMap: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/TreeMultimap.html
祝你好运:)答案 3 :(得分:0)
您还可以使用以下方法对哈希地图进行排序
private static HashMap sortByValues(HashMap map) {
List list = new LinkedList(map.entrySet());
// Defined Custom Comparator here
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue())
.compareTo(((Map.Entry) (o2)).getValue());
}
});
// Here I am copying the sorted list in HashMap
// using LinkedHashMap to preserve the insertion order
HashMap sortedHashMap = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
sortedHashMap.put(entry.getKey(), entry.getValue());
}
return sortedHashMap;
}
像调用方法一样
//移动你的hashmap
shift =sortByValues(shift)