Сортировка Java TreeSet с помощью Comparator

я пытаюсь отсортировать TreeSet объектов ("Etudiant"), используя интерфейс Comparator. Это реализация Comparator:

import java.util.Comparator;


public class TriParNom implements Comparator<Etudiant>{
    public int compare(Etudiant o1, Etudiant o2) {
        return o1.getNom().compareTo(o2.getNom());
    }
}

вот объявление TreeSet и вызов компаратора в основном:

TreeSet<Etudiant> University= new TreeSet<Etudiant>(new TriParNom());

ошибка, которую я получаю в основном классе, когда объявляю TreeSet и вызываю компаратор: для TreeSet(TriParNom) не найден подходящий конструктор.

Любые решения, пожалуйста? заранее спасибо .


person CoderTn    schedule 03.11.2018    source источник
comment
Можете ли вы добавить свои операторы импорта к вопросу. Я предполагаю, что вы используете другой TreeSet или Comparator.   -  person k5_    schedule 04.11.2018
comment
импортировать java.util.Collections; импортировать java.util.HashSet; импортировать java.util.Set; импортировать java.util.SortedSet; импортировать java.util.TreeSet;   -  person CoderTn    schedule 04.11.2018
comment
а импорт для TriParNom ?   -  person k5_    schedule 04.11.2018
comment
@k5 TriParNom — это класс в том же пакете, поэтому импортировать не нужно!   -  person CoderTn    schedule 04.11.2018
comment
Необходимо импортировать java.util.Comparator. Если это не так, у вас есть ответ: вы создали свой собственный интерфейс Comparator. Не делай этого.   -  person JB Nizet    schedule 04.11.2018
comment
Класс TriParNom должен импортировать java.util.Comparator. Если это не так, это означает, что в этом пакете есть другой класс Comparator.   -  person k5_    schedule 04.11.2018
comment
Я добавляю импорт из комментария ОП, возможно, это не импорт класса TriParNom, @YassinGharsallah, пожалуйста, отредактируйте свой пост и поместите правильный импорт для TriParNom, а также импорт для класса, где основное   -  person azro    schedule 04.11.2018
comment
в классе TriParNom нет ошибок и компаратор уже импортирован   -  person CoderTn    schedule 04.11.2018
comment
Опубликуйте полный минимальный пример, воспроизводящий проблему. У нас должна быть возможность скопировать код, который вы публикуете, вставить его без каких-либо изменений в нашу IDE и увидеть, как воспроизводится проблема.   -  person JB Nizet    schedule 04.11.2018
comment
@JBNizet, код уже есть в сообщении, вам нужно просто создать класс с именем «Etudiant», затем класс компаратора и основной класс для объявления набора деревьев (весь код есть)   -  person CoderTn    schedule 04.11.2018
comment
Что неясно в Мы должны иметь возможность скопировать код, который вы публикуете, вставить его без каких-либо изменений в нашу IDE и увидеть, как воспроизводится проблема.? Весь код вообще отсутствует. Просто прочитайте свой вопрос.   -  person JB Nizet    schedule 04.11.2018
comment
Учитывая, что в сообщении об ошибке упоминается TreeSet, а не jaa.util.TreeSet, я предполагаю, что ваши классы находятся в пакете по умолчанию и что вы определили свой собственный класс TreeSet. Но вы не опубликовали полный минимальный пример, так что это просто предположение.   -  person JB Nizet    schedule 04.11.2018


Ответы (2)


Я попробовал очень простую реализацию, основанную на предоставленной вами информации, и я даю вам свои результаты:

структура проекта

Класс Etudiant — это очень простое pojo.

public class Etudiant {

private String nom;

public String getNom() {
    return nom;
}

public void setNom(String nom) {
    this.nom = nom;
}   }

Класс TriParNom - это простой компаратор, который вы описали:

import java.util.Comparator;

public class TriParNom implements Comparator<Etudiant> {

    @Override
    public int compare(Etudiant o1, Etudiant o2) {
        return o1.getNom().compareTo(o2.getNom());
    }

}

А вот простой класс с точкой входа и примером метода для проверки только что созданного набора деревьев.

import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {
        TreeSet<Etudiant> u = new TreeSet<>(new TriParNom());
        System.out.printf("size? %d%n", u.size());      
    }

}

Результаты выполнения следующие:

exec

Судя по всему, ошибок компиляции тоже нет.

person S3lvatico    schedule 03.11.2018

Если ваш код соответствует приведенному ниже фрагменту, он должен работать без проблем. В тот момент, когда вы удалите часть implements Comparator<Etudiant> из class TriParNom, вы получите сообщение об ошибке, указывающее, что подходящий конструктор не найден. Теперь еще один глупый способ, которым это может произойти, если вы не перекомпилировали свои классы после того, как внедрили компаратор в свой TriParNom - но это слишком очевидно. Ваш класс, который содержит метод main (который объявляет Treeset), импортировал java.util.TreeSet?

import java.util.Comparator;
import java.util.TreeSet;

public class TreesetCheck {
    public static void main(String[] args) {
        TreeSet<Etudiant> University= new TreeSet<Etudiant>(new TriParNom());
    }
}

class TriParNom implements Comparator<Etudiant>{
    public int compare(Etudiant o1, Etudiant o2) {
        return o1.getNom().compareTo(o2.getNom());
    }
}

class Etudiant {
    public String getNom() {
        // TODO Auto-generated method stub
        return "some";
    }
}
person Raj    schedule 03.11.2018
comment
ошибка, которую я получил, - это когда я объявляю набор деревьев в основном и даю ему компаратор в параметре! других ошибок в других классах нет - person CoderTn; 04.11.2018
comment
Вы используете IDE для компиляции и запуска? - person Raj; 04.11.2018
comment
либо вы не реализовали компаратор для TriParNom, либо он не перекомпилирован (вручную или с помощью IDE) после того, как вы внедрили компаратор. Потому что ошибка, которую вы получили, проявляется, когда в классе нет компаратора javac com/TreesetCheck.java com/TreesetCheck.java:8: error: no suitable constructor found for TreeSet(TriParNom) - person Raj; 04.11.2018