从按字母顺序排列的列表中重新排序两个值。枚举/ Comparataor

时间:2014-08-20 22:57:36

标签: java sorting enums comparator comparable

值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,......的单词在我的代码中有不同的表示。 我有一个产品品牌名单,我想重新订购清单。

2 个答案:

答案 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;索引图。

如果这会给您带来问题,也不能将地图放在静态变量中。