簡體   English   中英

為什么 java 中的 TreeSet 表現如下?

[英]Why TreeSet in java behaving like below?

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

你的代碼有很多問題:

  1. 使用原始Comparator器而不是參數化版本。
  2. for循環中使用了錯誤的變量。
  3. 在比較器中使用static變量。

附帶說明一下,您應該遵循Java 命名約定,例如 class 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);
    }
}

Output:

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

注意:我剛剛在您的compare方法中實現了您的邏輯。 如果你能告訴我確切的要求,我會更新compare里面的代碼,或者你可以自己更新。

正是由於這個代碼循環限制,您使用“i<=a.size()-1”。 “a”從未在您的代碼中定義,這意味着要提供的大小為零,然后您減去 1,因此它將小於零。

這意味着這個循環只會被觸發一次。

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

您錯誤地實現了比較器。 檢查以下代碼:

        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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM