我刚开始调试一些用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
对象我想要显示的顺序元素?
答案 0 :(得分:2)
您可以使用LinkedHashSet
保持元素的顺序。
Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。请注意,如果将元素重新插入到集合中,则不会影响插入顺序。 (如果s.contains(e)在调用之前立即返回true,则调用s.add(e)时,将元素e重新插入到集合中。)
答案 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);
,它会按照枚举中定义的顺序显示所有日期。