Java HashSet - 有没有办法指定元素的显示顺序?

时间:2017-05-23 13:42:29

标签: java output hashset

我刚开始调试一些用Java编写的软件,在其中一个网页上有下拉列表,列出了一周中的几天。

展开后,列表会显示星期日到星期六的一周中的星期几。但是,如果未选择/展开下拉菜单,则会显示以下内容:

  

的Mo-苏涂-我们-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 /其他一些结构化数据类型,或者我可以专门告诉HashSet对象我想要显示的顺序元素?

3 个答案:

答案 0 :(得分:2)

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

Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。请注意,如果将元素重新插入到集合中,则不会影响插入顺序。 (如果s.contains(e)在调用之前立即返回true,则调用s.add(e)时,将元素e重新插入到集合中。)

LinkedHashSet

答案 1 :(得分:0)

  

据我了解,使用HashSets,您无法保证其元素的检索/显示顺序是正确的吗?

正确。

  

那么有没有办法可以指定HashSet的输出,在这种情况下使用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类的静态方法。

答案 2 :(得分:0)

首先,一周中的那些日子必须是枚举值。如果你这样做,你将能够使用:

EnumSet.allOf(DaysOfWeekEnum.class);,它会按照枚举中定义的顺序显示所有日期。