@zaorduu
учу java, надеюсь на лучшее

Как реализовать compareTo() для обобщенных классов?

Как реализовать метод compareTo() для корректной работы TreeSet? Насколько я знаю операторы нельзя перегружать, тогда как мне проверять (не)равенство полей для сортировки?
package com.company;
import java.util.*;
import static java.util.Objects.hash;

public class Main {
    
    static Random random = new Random();
    static void comapareSets(Set<Myset<Integer>> myset) {
        for (int i = 0; i < 15; i++) {
            int rand = random.nextInt(10);
            System.out.printf("%d ", rand);
            myset.add(new Myset<>(rand));
        }
        System.out.println();
        System.out.println(myset);
    }
    public static void main(String[] args) {
        Set<Myset<Integer>> myset = new LinkedHashSet<>(); 
        Set<Myset<Integer>> myset2 = new TreeSet<>();
        Set<Myset<Integer>> myset3 = new HashSet<>();
        System.out.println(myset.getClass().getSimpleName());
        comapareSets(myset);
        System.out.println(myset2.getClass().getSimpleName());
        comapareSets(myset2);
        System.out.println(myset3.getClass().getSimpleName());
        comapareSets(myset3);
    }
}

class Myset<T> implements Comparable<Myset<T>> {
    private final T data;

    public Myset(T data) {
        this.data = data;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) throw new NullPointerException();
        if (obj instanceof Myset<?>) {
            return ((Myset<?>) obj).data == this.data;
        }
        return false;
    }
    //a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object
    @Override
    public int compareTo(Myset<T> obj) {
        if (this.equals(obj)) {
            return 0;
        }
//        else if (obj.data < this.data)
//        {
//            return 1;
//        }
        return -1;
    }

    @Override
    public int hashCode() {
        return hash(data);
    }

    @Override
    public String toString() {
        return data.toString();
    }
}
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Akela_wolf
Extreme Programmer
Вы делаете класс Myset по сути оберткой над неким типом T и хотите чтобы Myset-ы можно было упорядочивать. Но при этом, вы не имеете никаких ограничений, касательно типа T. Что это вообще за тип? Какими свойствами обладает? Что такое сортировка, применительно к этим объектам?

Мало того, вы не сказать чтобы корректно реализовали метод equals. Не помню такого контракта что он должен бросать NPE, но далее вы просто используете ссылочное равенство (то есть требуете чтобы this.data и obj.data были одним объектом). А если там, например, Integer?

Тут я даже не знаю что можно предложить в плане сортировки. Сортировать по хэшкоду? Но там возможны коллизии. Тогда методы compareTo и equals могут войти в противоречие (compareTo скажет что объекты равны т.к. равны хэшкоды), а на самом деле они равны не будут. Это источник трудноотлавливаемых глюков.

Выглядит так, что вы пытаетесь решить какую-то очень странную задачу. Хотелось бы понять подробнее - зачем вам все это надо?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы