簡體   English   中英

Java HashSet-有沒有辦法指定元素顯示的順序?

[英]Java HashSet - is there a way to specify the order in which elements will be displayed?

我剛剛開始調試一些用Java編寫的軟件,並且在一個網頁上,有一個下拉列表,列出了一周中的每一天。

展開后,該列表顯示從星期日到星期六的下拉列表中的星期幾。 但是,如果未選擇/擴展下拉菜單,則文本顯示為:

莫 - 蘇塗我們-TH-FR-薩

即未選擇/展開按鈕時顯示的天數順序不正確。

我的想法是,這可能是因為使用HashSet對象編寫了該類以顯示日期:

private List<String> allDays = Arrays.asList(SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY);
...
private Set<String> currentDays = new HashSet<String>(allDays);

據我了解,使用HashSets,您不能保證將檢索/顯示其元素的順序-正確嗎?

我嘗試將類型從HashSet更改為ArrayList ,以便可以為集合中一周中的每一天設置確定的位置,但這在代碼中的其他位置引起了其他編譯​​錯誤。 我的想法是,必須將其實現為HashSet而不是有序列表的設計原因,因此,我真的不想重構代碼以更改對象的類型。

因此,有沒有一種方法可以指定HashSet的輸出(在這種情況下使用該輸出),以便預先確定其元素的顯示順序?

我可以將其ArrayList為有序列表的類型,即ArrayList /其他結構化數據類型,還是可以明確告訴HashSet對象以什么順序顯示其元素?

您可以使用LinkedHashSet保持元素順序。

Set接口的哈希表和鏈表實現,具有可預測的迭代順序。 此實現與HashSet的不同之處在於,它維護貫穿其所有條目的雙向鏈接列表。 此鏈表定義了迭代順序,即將元素插入到集合中的順序(插入順序)。 請注意,如果將元素重新插入到集合中,則插入順序不會受到影響。 (如果在s.contains(e)在調用之前即將返回true的情況下調用s.add(e),則將元素e重新插入到set s中。)

LinkedHashSet

據我了解,使用HashSets,您不能保證將檢索/顯示其元素的順序-正確嗎?

正確。

因此,有沒有一種方法可以指定HashSet的輸出(在這種情況下使用該輸出),以便預先確定其元素的顯示順序?

toString()方法以無法更改的順序“輸出”元素。

但是,您可以編寫一種以特定順序顯示HashSet元素的方法。 例如:

private static String[] DAYS = {"Sun", "Mon", "Tue", "Wed", "Thu", 
                                "Fri", "Sat"};

String printDays(Set<String> days) {
    StringBuilder sb = new StringBuilder();
    for (String s: DAYS) {
        if (days.contains(s)) {
            if (sb.length() == 0) {
                sb.append("{" + s);
            } else {
                sb.append(", " + s);
            }
         }
     }
     sb.append("}");
     return sb.toString();
 }

可以很容易地將其修改為與enum一起使用...,並且該方法可以是enum類的靜態方法。

首先,一周中的那幾天必須是枚舉值。 如果這樣做,您將可以使用:

EnumSet.allOf(DaysOfWeekEnum.class); 它將按照枚舉中定義的順序顯示您的所有日子。

暫無
暫無

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

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