Java - массив объектов для HashSet - PullRequest
2 голосов
/ 09 июля 2011

У меня есть следующий массив:

private static Optreden[] optredens = {
            new Optreden("Editors", "Main Stage", 16, 0, 4),
            new Optreden("Empire of the Sun", "Pyramid Marquee", 23, 45, 5),
            new Optreden("Florence and the Machine", "Marquee", 18, 45, 3),
            new Optreden("The Specials", "Marquee", 13, 10, 5),
            new Optreden("Muse", "Main Stage", 19, 0, 5),
            new Optreden("Faithless", "Main Stage", 14, 30, 5),
            new Optreden("Absynthe Minded", "Pyramid Marquee", 21, 45, 5),
            new Optreden("Pink", "Main Stage", 20, 30, 2),
            new Optreden("Editors", "Marquee", 21, 20, 4),
            new Optreden("Faithless", "Pyramid Marquee", 19, 0, 5)
            };

Конструктор объекта Optreden выглядит следующим образом:

Optreden(name, stage, hour, minutes, rating);

Теперь я должен создать HashSet объектов Optreden, НО он может не содержать повторяющихся имен, поэтому при печати HashSet он должен выглядеть следующим образом:

The Specials (Marquee, 13u10)--> *****
Empire of the Sun (Pyramid Marquee, 23u45)--> *****
Florence and the Machine (Marquee, 18u45)--> ***
Pink (Main Stage, 20u30)--> **
Muse (Main Stage, 19u)--> *****
Absynthe Minded (Pyramid Marquee, 21u45)--> *****
Editors (Main Stage, 16u)--> ****
Faithless (Main Stage, 14u30)--> *****

Дело в том, что я не могу редактировать класс Optreden, и у него есть только конструктор и метод toString, нет getName () getter.

Как я могу это осуществить? Спасибо.

Ответы [ 3 ]

4 голосов
/ 09 июля 2011

Должен ли это быть HashSet? Если вы хотите использовать вместо этого TreeSet, создайте его с пользовательским компаратором, который сравнивает имена. Что-то вроде (не скомпилировано или протестировано!):

Comparator<Optreden> compareByName = new Comparator<Optreden>() {
    public int compare(Optreden a, Optreden b) {
        return getName(a).compareTo(getName(b));
    }
    private String getName(Optreden o) {
        String s = o.toString();
        return s.substring(0, (s.indexOf('(') - 1);
    }
}

Set<Optreden> optredensUniqueByName = new TreeSet<Optreden>(compareByName);
optredensUniqueByName.addAll(Arrays.asList(optredens));
3 голосов
/ 09 июля 2011

Пока Optreden не является классом final, вы можете создать его подкласс для захвата name в конструкторе и реализовать equals() и hashcode() для использования name следующим образом:

public class MyOptreden extends Optreden
{
    private String name;

    public MyOptreden(String name, String stage, int hour, int minutes, int rating) {
        super(name, stage, hour, minutes, rating);
        this.name = name; // A capture name here
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof MyOptreden && ((MyOptreden) obj).name.equals(name);
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }
}

Пока вы используете только экземпляры этого класса в вашем наборе, он будет работать.

Вам придется переопределить setName(), если он существует, для обновления name.

0 голосов
/ 09 июля 2011

Пожалуйста, смотрите мой комментарий.В соответствии с текущими ограничениями, приведенными в исходном вопросе, т. Е. Доступны только конструктор и метод toString (), вы можете создать набор, используя упорядоченный набор (например, TreeSet) и пользовательскую реализацию Comparator.Ваша реализация Comparator будет затем использовать единственный метод доступа Optreden.toString() для анализа имени группы.например,

class OptredenComparator implements Comparator<Optreden> {
...

 int compare(Optreden o1, Optreden o2) {
     // this is to illustrate the logic. Mind the nulls
     String name1 = o1.split("(")[0];
     String name2 = o2.split("(")[0];
     return name1.compareTo(name2);
 }
...
}

Затем вы можете создать TreeSet(new OptredenComparator) и добавить к нему ваши экземпляры Optreden.

Я хотел бы подчеркнуть, что, хотя это и является ответом на оригиналвопрос, коренная проблема, которую необходимо решить, - это дизайн класса, используемого в качестве контейнера данных (Optreden)

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...