我有一个哈希图,它包含键-字符串类型-奶酪对象数组:
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。我知道它听起来已经很疯狂了,但也很有趣!
我考虑过使用比较器和TreeMap,但是它们似乎不适合这个问题。
任何指针都会有所帮助。
最佳答案
您可能想要做的是扩展您的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
方法违反总排序时,这将失败。另外,如果您只有一个
String
字段,那么我也将考虑使用字符串来表示奶酪。排序可能对您不起作用,因为您的类之前没有实现
Comparable
。作为
Comparable
的替代方法,您可能还想实现Comparator
接口,这样就可以从实际的Cheese
类中分离出不同的奶酪分类策略。编辑:显示如何实现您的目标
所以你说
我想获取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);
}