为什么java中的TreeSet表现如下?

为什么java中的TreeSet表现如下?,java,collections,Java,Collections,在上面的代码中,我尝试将对象添加到树集中,在添加所有元素后,当我尝试打印树集时,只添加第一个元素。为什么会发生这种情况 结果->[[item15858427262930912]正是由于您使用的代码循环限制,您的代码有很多问题: 使用原始比较器代替参数化版本。 在for循环中使用错误的变量。 在比较器中使用静态变量。 另一方面,您应该遵循以下步骤:例如,类mycomparator应命名为mycomparator 以下是包含这些注释的代码: for(int i=0; i<=a.size()-1

在上面的代码中,我尝试将对象添加到树集中,在添加所有元素后,当我尝试打印树集时,只添加第一个元素。为什么会发生这种情况


结果->[[item15858427262930912]

正是由于您使用的代码循环限制,您的代码有很多问题:

使用原始比较器代替参数化版本。 在for循环中使用错误的变量。 在比较器中使用静态变量。 另一方面,您应该遵循以下步骤:例如,类mycomparator应命名为mycomparator

以下是包含这些注释的代码:

for(int i=0; i<=a.size()-1; i++){
    ts.add(a5.get(i));
}

注意:我刚刚在比较方法中实现了您的逻辑。如果您能告诉我确切的要求,我将更新compare中的代码,或者您可以自己更新。

您错误地实现了comparator。检查以下代码:

[[Item1, 58584272, 62930912], [Item3, 37469674, 46363902], [Item4, 18666489, 88046739], [Item2, 9425650, 96088250]]

您正在使用的参数值是多少?它不能是零,正如这里所指出的,因为您不能将第零个列表元素解析为字符串;并使用Comparator.reverse反转其顺序。使用未定义的标识符会导致编译器错误。它不会神奇地使表达式a.size计算为零。这仅仅是因为问题中发布的代码与OP实际运行的代码不匹配。@AndyTurner-我刚刚在他的compare方法中重构了代码,但逻辑对我来说没有意义。我在最后加了一张便条。不,你改了。例如,当订单为1时,OP的代码可以同时返回1和-1。Comparator.comparingIntlist->Integer.parseIntlist.GetParameter将是指定比较器的更简单的方法。感谢@AndyTurner找到它。我已经更新了答案。一切看起来都很好,我犯了一些错误,你改正了。真的谢谢。但我想问的一个主要问题是使用原始比较器而不是参数化版本。为什么会这样?虽然我使用了原始比较器,但在比较方法中,我正在转换,然后根据需要进行比较,并返回整数,对吗?运行时使用原始比较器和参数化比较器有什么区别?@Arun-非常欢迎您。与其解释参数化类型的重要性,我建议您仔细阅读。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

class MyComparator implements Comparator<List<String>> {

    int order, paramenter;

    MyComparator(int order, int paramenter) {
        this.order = order;
        this.paramenter = paramenter;
    }

    @Override
    public int compare(List<String> o1, List<String> o2) {
        int b1 = Integer.parseInt(o1.get(paramenter));
        int b2 = Integer.parseInt(o2.get(paramenter));
        if (b1 > b2) {
            return order == 1 ? 1 : -1;
        } else if (b1 < b2) {
            return order == 1 ? -1 : 1;
        } else {
            return 0;
        }
    }
}

public class Main {

    public static void main(String[] args) {

        ArrayList<String> a1 = new ArrayList<String>();
        a1.add("Item1");
        a1.add("58584272");
        a1.add("62930912");

        ArrayList<String> a2 = new ArrayList<String>();
        a2.add("Item2");
        a2.add("9425650");
        a2.add("96088250");

        ArrayList<String> a3 = new ArrayList<String>();
        a3.add("Item3");
        a3.add("37469674");
        a3.add("46363902");

        ArrayList<String> a4 = new ArrayList<String>();
        a4.add("Item4");
        a4.add("18666489");
        a4.add("88046739");

        List<ArrayList<String>> a5 = new ArrayList<ArrayList<String>>();
        a5.add(a1);
        a5.add(a2);
        a5.add(a3);
        a5.add(a4);

        TreeSet<List<String>> ts = new TreeSet<List<String>>(new MyComparator(0, 1));
        for (int i = 0; i < a5.size(); i++) {
            ts.add(a5.get(i));
        }
        System.out.println(ts);
    }
}
[[Item1, 58584272, 62930912], [Item3, 37469674, 46363902], [Item4, 18666489, 88046739], [Item2, 9425650, 96088250]]
        List<String> a1 = new ArrayList<String>();
        a1.add("Item1");
        a1.add("58584272");
        a1.add("62930912");

        List<String> a2 = new ArrayList<String>();
        a2.add("Item2");
        a2.add("9425650");
        a2.add("96088250");

        List<String> a3 = new ArrayList<String>();
        a3.add("Item3");
        a3.add("37469674");
        a3.add("46363902");

        List<String> a4 = new ArrayList<String>();
        a4.add("Item4");
        a4.add("18666489");
        a4.add("88046739");

        List<List<String>> a = new ArrayList<List<String>>();
        a.add(a1);
        a.add(a2);
        a.add(a3);
        a.add(a4);

        Comparator<List<String>> comparator = new Comparator<List<String>>() {

            @Override
            public int compare(List<String> a1, List<String> a2) {
                String b1 = a1.get(0);
                String b2 = a2.get(0);

                return b1.compareTo(b2);
            }
        };

        TreeSet<List<String>> ts = new TreeSet<List<String>>(comparator);
        for (int i = 0; i <= a.size() - 1; i++) {
            ts.add(a.get(i));
        }

        System.out.println(ts);