我有一个哈希图,它包含键-字符串类型-奶酪对象数组:

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);
}

10-08 02:53