我可以对hashmap(T)中包含的arraylist进行排序吗?

时间:2016-03-18 01:03:06

标签: java arrays sorting hashmap

我有一个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,但他们似乎不适合这个问题。 任何指针都会有所帮助。

7 个答案:

答案 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;
}



}