我有一个hashmap,它包含Key - String Type - 一个干酪对象数组:
public void testing(){
HashMap<String, ArrayList<cheese>> one = new HashMap<>();
ArrayList<cheese> two = new ArrayList<>();
cheese seven = new cheese("59");
cheese eight = new cheese("60");
cheese nine = new cheese("12");
cheese ten = new cheese("15");
two.add(seven);
two.add(eight);
two.add(nine);
two.add(ten);
one.put("hello", two);
}
这是我的奶酪班:
public class cheese {
String num;
public cheese(String num){
this.num = num;
}
public String getString(){
return num;
}
}
我想获取ArrayList并对ArrayList中的每个元素进行排序,然后将对象放回哈希映射中。
这是java.I知道它已经听起来很疯狂但也很有趣!
我考虑使用Comparators和TreeMaps,但他们似乎不适合这个问题。 任何指针都会有所帮助。
答案 0 :(得分:1)
您可能希望扩展Cheese
课程以实施Comparable<Cheese>
界面。
但这假定您的Cheese
个实例可构成总订单。如果您不知道总订单是什么,我会建议您先了解订购。
您的同类课程应具备的基本功能:
您可以通过以下链接了解更多相关信息: http://algs4.cs.princeton.edu/21elementary/
基本上,当您的Cheese
类实现Comparable
接口时,它会继承方法public int compareTo(T o);
。您必须实现此方法并根据Cheese
实例的状态返回负整数或0或正整数,因为比较的Cheese
实例在总排序中小于或等于或大于。
如果您的示例中只有Cheese
中的一个实例字段,那就是num
字段,您可以按照以下几行编写内容:
public class Cheese implements Comparable<Cheese> {
String num;
public Cheese(String num){
this.num = num;
}
public String getString(){
return num;
}
public int compareTo(Cheese that) {
return this.num.compareTo(that.num);
}
}
请注意,这是一种有点退化(或幸运?)的情况,因为Cheese
类的状态仅取决于单个String
。因此,在这种情况下,通过比较num
字段可以轻松地确定哪一个更小,相等或更大。另一方面,如果您稍后将课程扩展到其他字段,那么您应该准备修改compareTo
方法以考虑这些字段,并使课程遵循总排序的功能。
一个很好的做法是让你的班级能够控制所有3个功能(反身性,反对称性,传递性)的单元测试,当你添加新字段时,这些功能会失败,而你的compareTo
方法会违反总排序。< / p>
此外,如果你有一个String
字段,我也会考虑使用字符串代表奶酪。
可能排序对您不起作用,因为您的课程之前没有实现Comparable
。
作为Comparable
的替代方法,您可能还希望实现Comparator
接口,这样您就可以从实际的Cheese
类中分离出不同的奶酪排序策略。 / p>
编辑:展示如何实现目标
所以你说那个
我想获取ArrayList并对其中的每个元素进行排序 然后将ArrayList放回哈希映射
然后你可以这样做(使用我上面的Cheese
课程):
public void testing(){
HashMap<String, List<Cheese>> one = new HashMap<>();
List<Cheese> two = new ArrayList<>();
Cheese seven = new Cheese("59");
Cheese eight = new Cheese("60");
Cheese nine = new Cheese("12");
Cheese ten = new Cheese("15");
two.add(seven);
two.add(eight);
two.add(nine);
two.add(ten);
System.out.println(two);
assert "59".equals(two.get(0).num);
assert "60".equals(two.get(1).num);
assert "12".equals(two.get(2).num);
assert "15".equals(two.get(3).num);
Collections.sort(two);
System.out.println(two);
assert "12".equals(two.get(0).num);
assert "15".equals(two.get(1).num);
assert "59".equals(two.get(2).num);
assert "60".equals(two.get(3).num);
one.put("hello", two);
}
答案 1 :(得分:0)
您可以从hashMap中获取一个数组,并使用Arrays.sort对其进行排序。没有必要把它放回去,hashmap已经有了一个参考。使用树集而不是数组将在每次添加元素时消除排序的需要。树集是一个集合,因此如果这是一个问题,将不允许重复。
答案 2 :(得分:0)
我假设你提供了一个最小的例子。否则,您可以在将列表放入Map
之前对列表进行排序。
话虽如此,您可以直接在Map
中更改可变值类型,而不会出现任何问题。
所以像下面的代码完全没问题:
Map myMap = one.get("hello");
sortMyMap(myMap);
这将导致对地图内的列表进行排序(假设sortMyMap
对元素进行排序)。
如果地图中的value元素是不可变的,您只需使用新的put
覆盖它:
Map myMap = one.get("hello");
Map mySortedMap = sortMyMap(myMap);
one.put("hello", mySortedMap);
请注意,在此示例中,我假设sortMyMap
创建了一个返回的新的已排序的地图。
答案 3 :(得分:0)
有。这2行将对您的所有ArrayLists
进行排序。
for(String key: one.keySet()) {
Collections.sort(one.get(key));
答案 4 :(得分:0)
这是一个班轮:
:development
这意味着,使用one.values().forEach(l -> l.sort(Comparator.comparing(cheese::getString)));
对象sort()
的结果,在名为List<cheese>
的地图中作为值存储的每个one
上调用cheese
1}}排序列表元素的方法。
答案 5 :(得分:0)
你可以在你的Cheese类中实现Comparator,如:
public class Cheese implements Comparator<Cheese>{
String num;
public Cheese(String num){
this.num = num;
}
public Cheese() {
}
public String getCheese(){
return num;
}
@Override
public int compare(Cheese o1, Cheese o2) {
return o1.getCheese().compareTo(o2.getCheese());
}
然后在你的testing()方法中,在 - one.put(&#34;你好&#34;,两个)之前; 你可以写
Collections.sort(two, new Cheese());
one.put("hello", two);
我认为您将在HashMap中获取已排序的ArrayList。希望这会有所帮助。
答案 6 :(得分:0)
答案,谢谢你们;
public class one {
public void testing(){
HashMap<String, ArrayList<cheese>> one = new HashMap<>();
ArrayList<cheese> two = new ArrayList<>();
two.add(new cheese("59"));
two.add(new cheese("70"));
two.add(new cheese("65"));
two.add(new cheese("25"));
one.put("hello", two);
System.out.println(one.get("hello"));
Collections.sort(two, new Comparator<cheese>() {
@Override
public int compare(cheese o1, cheese o2) {
// TODO Auto-generated method stub
return o1.getCheese().compareTo(o2.getCheese());
}
});
System.out.println(one.get("hello"));
}
public String RemovingThe(){
String tmp = "^(?:The)\\s(.+)$";
Pattern a = Pattern.compile(tmp);
Matcher b = a.matcher(" he cat in the hat");
if(b.find()){
return b.group(1);
}else{
String nop = "no";
return nop;
}
}
public static void main (String args[]){
one two = new one();
two.testing();
System.out.println(two.RemovingThe());
}
}
\\\\\\\\\\ onetwothree //////////////////
public class cheese{
String num;
public cheese(String num){
this.num = num;
}
public String getCheese(){
return num;
}
public String toString(){
return num;
}
public void setCheese(String num){
this.num = num;
}
}