簡體   English   中英

Java - HashSet 的對象數組

[英]Java - Array of Objects to HashSet

我有以下數組:

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 object 構造函數如下所示:

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

現在,我必須創建一個 Optreden 對象的 HashSet,但它可能不包含重復的名稱,所以當我打印 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 class,它只有一個構造函數和一個 toString 方法,沒有 getName() getter。

我怎樣才能做到這一點? 謝謝。

它必須是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));

只要Optreden不是final的 class,您可以將其子類化以在構造函數中捕獲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();
    }
}

只要您在您的集合中僅使用此 class 的實例,它就可以工作。

您必須覆蓋setName() (如果存在)以更新name

請看我的評論。 在原始問題中給出的當前限制下,即只有一個構造函數和一個 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 實例添加到其中。

我想強調的是,雖然這是對原始問題的答案,但需要解決的根本問題是用作數據容器的 class 的設計(Optreden)

}

暫無
暫無

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

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