值A,B,C,D,E,F,G的编码列表.... 我希望在迭代JSP中的列表时将D放在C之前。
我愿意使用枚举或使用比较器。
目前,enum SortOrder与我目前拥有的Comparable不同。
那么我该如何处理以下代码。
//override
public int compareTo(Alphabets) {
return name.toLowerCase().compareTo(o.getName().toLowerCase());
}
我试过
private SortOrder so
public void setName(String name) {
this.name = so.values().toString();
}
但它抛出“应该以静态方式访问SortOrder类型的静态方法值()”
请帮帮我。
我已经尝试过stackoverflow并发现了这个,这很接近,但还不够: Java Sorting based on Enum constants
编辑:抱歉让大家感到困惑,上面的问题只是我的问题的一个表示。我对A,B,C,......的单词在我的代码中有不同的表示。 我有一个产品品牌名单,我想重新订购清单。
答案 0 :(得分:4)
基本上,你对默认的compareTo很满意,但是你想要一点点差别吧?
if (this.name.equals("D2") && that.name.equals("D1")) return -1;
if (this.name.equals("D1") && that.name.equals("D2")) return 1;
return super.compareTo(that);
答案 1 :(得分:1)
我仍然不太确定我理解你的问题,但如果我这样做,这里有两个解决方案:
最小的解决方案,仅限于枚举值的可能名称。 demo
enum SortOrderEnum {
A, B, D, C, E, F;
}
排序
Collections.sort(testData, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return SortOrderEnum.valueOf(s1).compareTo(SortOrderEnum.valueOf(s2));
}
});
你可以放任何你想要的字符串,我没有看到在这个解决方案中使用枚举的重点。我们将每个字符串的预期索引放在静态映射中。 demo
public class SortOrder {
public static final Map<String, Integer> SORT_ORDER = initializeSortOrder();
private static Map<String, Integer> initializeSortOrder() {
List<String> orderedStrings = Arrays.asList(
"A",
"B",
"D",
"C",
"E",
"F"
);
Map<String, Integer> indexByString = new HashMap<>();
for (int index = 0; index < orderedStrings.size(); ++index) {
indexByString.put(orderedStrings.get(index), index);
}
return Collections.unmodifiableMap(indexByString);
}
}
排序
Collections.sort(testData, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return SORT_ORDER.get(s1).compareTo(SORT_ORDER.get(s2));
}
});
请注意,这是如何填充地图的示例。您可以(更好)从配置文件中填充string-&gt;索引图。
如果这会给您带来问题,也不能将地图放在静态变量中。