首页 > 解决方案 > 为什么Java中的TreeSet表现如下?

问题描述

    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<List<String>> a5=new ArrayList<List<String>>();
    a5.add(a1);
    a5.add(a2);
    a5.add(a3);
    a5.add(a4);     


    TreeSet<List<String>> ts=new TreeSet<List<String>>(new mycomparator());
    for(int i=0; i<=a.size()-1; i++){
        ts.add(a5.get(i));
    }
System.out.Println(ts);   // Returns [[Item1, 58584272, 62930912]]





public class mycomparator implements Comparator{

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

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

结果 --> [[Item1, 58584272, 62930912]]

标签: javacollections

解决方案


你的代码有很多问题:

  1. 使用原始Comparator版本而不是参数化版本。
  2. for在循环中使用错误的变量。
  3. static在比较器中使用变量。

附带说明一下,您应该遵循Java 命名约定,例如该类mycomparator应命名为MyComparator.

下面给出了包含这些注释的代码:

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]]

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


推荐阅读