Почему TreeSet в java ведет себя как ниже? - PullRequest
0 голосов
/ 30 апреля 2020
    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]]

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

В вашем коде так много проблем:

  1. Использование raw Comparator вместо параметризованной версии.
  2. Использование неверной переменной в for l oop.
  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]]

Примечание: Я только что реализовал вашу логику c внутри вашего compare метода как есть. Если вы можете сказать мне точное требование, я обновлю код внутри compare или вы можете обновить его самостоятельно.

0 голосов
/ 30 апреля 2020

Вы неправильно внедрили компаратор. Проверьте следующий код:

        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);
0 голосов
/ 30 апреля 2020

Именно из-за этого кода l oop limit вы используете "i <= a.size () - 1". «A» никогда не определяется в вашем коде, это означает, что предоставляемый размер равен нулю, тогда вы минус 1, поэтому он будет меньше нуля. </p>

Это означает, что l oop будет срабатывать только один раз .

for(int i=0; i<=a.size()-1; i++){
    ts.add(a5.get(i));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...