我可以简单地使用TreeSet对ArrayList的ArrayList进行排序吗?

DSl*_*r64 0 java arraylist hashset treeset

===主要编辑(和次要编辑)===

我已经完全重写一个我前两天提交,因为它是基于两个人的代码不那么好深思熟虑的帅哥,从gitgo一个非常不合适的想法的代码.我不好好研究不够.

不过,@ F. Böller非常友好地回答了关于我原始代码的问题,并说我需要comparator在这个背景下定义: TreeSet<ArrayList<Integer>> hs = new TreeSet<>(comparator);.

这就是我需要谷歌java树木比较器的所有鼓励,并根据我在那里看到的修改.这一点都不容易,我承认我仍然不太明白为什么下面的语法基本上都是我需要的,但是如果没有Googled链接上面的例子,我就永远不会想到它.

TreeSet<Leaf> theTreeSet = new TreeSet<>(new HowToCompareLeaves());

===次要编辑 - 以下行错误:

无论如何,下面的代码工作得很好(根据每个"叶子"中的第一个元素排序).

===以下行是正确的:

无论如何,下面的代码工作得很好(对每个"叶子"中的所有元素进行排序和比较).

===结束次要编辑===

但是,如果有人可以解释(对于之前从未使用过的人)上面的线实际上做了什么,我会很感激.它似乎定义了一个新的实例,它被定义为比较由......组成的数据项的方法.是吗?它是一个新的构造函数,需要定义如何将新元素分类到自身?TreeSetarTreeSet

package treed;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetExample {

  public static final int NR = 4, NC = 3;

  public static void main(String a[])
  {
    ArrayList<Leaf> ar = new ArrayList<>(NR);

    for (int i = 0; i < NR; i++)
     ar.add(new Leaf());

    System.out.println("Pre-sort:");
    for(int i = 0; i < NR; i++)
      System.out.println(ar.get(i));

    TreeSet<Leaf> theTreeSet = new TreeSet<>(new HowToCompareLeaves());

    System.out.println("\nPost-sort:");
    for (int i = 0; i < NR; i++)
      theTreeSet.add(ar.get(i));

    for(Leaf e:theTreeSet)           
      System.out.println(e);
  }
}

class HowToCompareLeaves implements Comparator<Leaf>
{
  @Override 
  public int compare(Leaf e, Leaf f) 
  {
    if(e.row.get(0) > f.row.get(0)) return  1;
    if(e.row.get(0) < f.row.get(0)) return -1;
    return 0;
  }
}    

class Leaf
{
    ArrayList<Integer> row;  

    Leaf()
    {
      row = new ArrayList<>(TreeSetExample.NC);
      for (int i = 0; i < TreeSetExample.NC; i++)
        row.add((int)(Math.random()*89 + 10));
    }

  public String toString()
  {
    String s = "";
    for (int i = 0; i < TreeSetExample.NC; i++) {
      s += row.get(i) + "...";
    }
    return s;
  }
}
Run Code Online (Sandbox Code Playgroud)

===编辑结束; 休息是垃圾=======================

我正在关注一个关于ArrayList的ArrayList的一个新的未解答的问题,该ArrayList需要进行非重复数据删除和排序.一个答案建议使用a HashSet来启用删除重复项,但不会排序,因为下面的工作代码确认.

import java.util.ArrayList;
import java.util.HashSet;

public class TwoDimArrayList {

  static           ArrayList<Integer> r;
  static ArrayList<ArrayList<Integer>> a2D = new ArrayList<>();

  public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
      r = new ArrayList<>();
      for (int j = 0; j < 3; j++)
        r.add((int)(Math.random() * 89 + 11));
      a2D.add(r);
    }
    for (int i = 0; i < a2D.size(); i++){
      for (int j = 0; j < a2D.get(i).size(); j++) 
        System.out.print(a2D.get(i).get(j) + "\t");
      System.out.println("...");
    }

    HashSet<ArrayList<Integer>> hs = new HashSet<>(a2D.size());

    for (int i = 0; i < a2D.size(); i++)
      hs.add(a2D.get(i));

    a2D.clear();

    for (int i = 0; i < hs.size(); i++)
      a2D.add((ArrayList<Integer>) hs.toArray()[i]);

    for (int i = 0; i < a2D.size(); i++){ 
      for (int j = 0; j < a2D.get(i).size(); j++)
        System.out.print(a2D.get(i).get(j) + "\t");
      System.out.println();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我试过简单地改变HashSet,TreeSet因为后者提供了排序:

TreeSet<ArrayList<Integer>> hs = new TreeSet<>(a2D.size());
Run Code Online (Sandbox Code Playgroud)

这给了错误:cannot infer arguments for TreeSet.所以我最终摆脱它:

TreeSet<ArrayList<Integer>> hs = new TreeSet<>();
Run Code Online (Sandbox Code Playgroud)

但我在这一行得到错误:

  hs.add(a2D.get(i));
Run Code Online (Sandbox Code Playgroud)

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Comparable

对此有一些简单的解决方法吗?或者希望TreeSet能够进行排序本身就是错误的?(我是新手套装,万一有人想知道......)

F. *_*ler 7

TreeSet不知道如何对ArrayLists进行排序,因为列表没有自然排序.它应该将列表与值的最小值,列表的平均值或其他值进行比较吗?要使TreeSet了解要排序的内容,必须向构造函数添加一个比较器:

TreeSet<ArrayList<Integer>> hs = new TreeSet<>(comparator);
Run Code Online (Sandbox Code Playgroud)

比较器必须实现接口Comparator<ArrayList>.在这里您可以定义如何订购ArrayList.如果不添加比较器,TreeSet会隐式地期望ArrayList实现Comparable-Interface,而它不会这样做.