Java 我可以简单地使用TreeSet对ArrayList中的ArrayList进行排序吗?
==主要编辑(和次要编辑)== 我已经完全重写了我几天前提交的代码,因为它是基于另外两个未经深思熟虑的大块代码编写的,这是gitgo的一个非常不恰当的想法。我的缺点是没有进行足够的研究 尽管如此,@F.Böller还是很好心地回答了关于我的原始代码的问题,并说我需要在这种情况下定义一个Java 我可以简单地使用TreeSet对ArrayList中的ArrayList进行排序吗?,java,arraylist,hashset,treeset,Java,Arraylist,Hashset,Treeset,==主要编辑(和次要编辑)== 我已经完全重写了我几天前提交的代码,因为它是基于另外两个未经深思熟虑的大块代码编写的,这是gitgo的一个非常不恰当的想法。我的缺点是没有进行足够的研究 尽管如此,@F.Böller还是很好心地回答了关于我的原始代码的问题,并说我需要在这种情况下定义一个比较器: TreeSet并根据我在那里看到的内容修改。这一点都不容易,我承认我仍然不太清楚为什么下面的语法在很大程度上是我所需要的,但是如果没有上面谷歌链接上的示例,我永远不会想到它 TreeSet theTree
比较器
:
TreeSet并根据我在那里看到的内容修改。这一点都不容易,我承认我仍然不太清楚为什么下面的语法在很大程度上是我所需要的,但是如果没有上面谷歌链接上的示例,我永远不会想到它
TreeSet theTreeSet=newtreeset(newhowtompareLeaves())代码>
==次要编辑--以下行错误:
无论如何,下面的代码工作得很好(根据每个“叶”中的第一个元素进行排序)
==以下行是正确的:
无论如何,下面的代码工作得很好(对每个“叶子”中的所有元素进行排序和比较)
==结束小编辑===
但是,如果有人能解释(对以前从未使用过TreeSet
的人)上面这行的实际功能,我将不胜感激。它似乎定义了一个新的实例,它被定义为比较ar
由以下内容组成的数据项的方法。。。是吗??它是定义如何将新元素排序到自身中所需的新树集的构造函数吗???
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;
}
}
我尝试简单地将HashSet
更改为TreeSet
,因为后者提供排序:
TreeSet<ArrayList<Integer>> hs = new TreeSet<>(a2D.size());
但我在这一行中发现了错误:
hs.add(a2D.get(i));
线程“main”java.lang.ClassCastException中的异常:java.util.ArrayList不能转换为java.lang.Comparable
有什么简单的解决办法吗?还是希望TreeSet
本身能够完成排序就错了?(我不熟悉集合,以防有人想知道……如果您想对列表的列表进行排序,那么您必须自己编写逻辑。Java无法自动推断这种顺序
TreeSet
使用元素的自然顺序对整个集合进行排序。然而,在您的例子中,这种自然排序是未定义的,因此树集不知道如何对ArrayList排序,因为列表没有自然排序。它应该按值的最小值、列表的平均值或其他值来比较列表吗?
要使树集了解要排序的内容,必须向构造函数添加一个比较器:
TreeSet<ArrayList<Integer>> hs = new TreeSet<>(comparator);
TreeSet hs=新的TreeSet(比较器);
比较器必须实现接口比较器
。在这里,您可以定义如何对ArrayList排序。
如果不添加comparator,TreeSet会隐式地期望ArrayList实现可比接口,但它没有做到这一点。您希望这样的列表如何排序?为了进行排序,您至少需要能够比较其元素。更具体地说,您希望根据什么标准对列表进行排序?我想实现Comparable
是下一步的方向。就像我说的,集合是新的,以前从未使用过HashSet
或TreeSet
。我猜我假设会有一个默认的排序顺序。我应该在发布之前做更多的研究。另外,我假设另一个线程的海报使用了一个带有哈希集的短循环,有一些具体的东西可以从中继续,因为我从中演化出来的代码确实消除了重复。所以我要去研究了。谢谢你温柔地叫醒我。--谢谢你的建议,而不是仅仅用一个(当之无愧的)否决票把我推到一边。多亏了你的一句话,我终于完成了任务。
hs.add(a2D.get(i));
TreeSet<ArrayList<Integer>> hs = new TreeSet<>(comparator);