基于枚举对 TreeMap 进行排序
Sort TreeMap based on a Enum
我有一个树图:
TreeMap<String, List<MyObject>> myTreeMap = new TreeMap<String, List<MyObject>>(new MyComparator());
我想根据 enum
.
的顺序对这个 TreeMap 进行排序
MyActionEnum:
public enum MyActionEnum implements Serializable {
ADD("Add"),
UPDATE("Update"),
DELETE("Delete");
private String action;
private static final long serialVersionUID = 1L;
MyActionEnum(String action) {
this.action = action;
}
public String get() {
return this.action;
}
}
这样在我的 TreeMap 中,顺序应该是 添加、更新、删除。
我的比较器:
public class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
// how to compare here based on enum.
}
}
首先,您需要一种从键中查找枚举值的方法。做到这一点的最佳方法是枚举本身的方法,因此它是可重用的:
public static MyActionEnum fromAction(String action) {
for (MyActionEnum e : values())
if (e.action.equals(action))
return e;
if (action == null)
throw new NullPointerException("Action is null");
throw new IllegalArgumentException("Unknown action: " + action);
}
如果有很多枚举值,您可能希望用地图查找替换此处完成的顺序搜索。
然后您可以在 compare()
方法中使用它:
@Override
public int compare(String o1, String o2) {
return Integer.compare(MyActionEnum.fromAction(o1).ordinal(),
MyActionEnum.fromAction(o2).ordinal());
}
我有一个树图:
TreeMap<String, List<MyObject>> myTreeMap = new TreeMap<String, List<MyObject>>(new MyComparator());
我想根据 enum
.
MyActionEnum:
public enum MyActionEnum implements Serializable {
ADD("Add"),
UPDATE("Update"),
DELETE("Delete");
private String action;
private static final long serialVersionUID = 1L;
MyActionEnum(String action) {
this.action = action;
}
public String get() {
return this.action;
}
}
这样在我的 TreeMap 中,顺序应该是 添加、更新、删除。
我的比较器:
public class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
// how to compare here based on enum.
}
}
首先,您需要一种从键中查找枚举值的方法。做到这一点的最佳方法是枚举本身的方法,因此它是可重用的:
public static MyActionEnum fromAction(String action) {
for (MyActionEnum e : values())
if (e.action.equals(action))
return e;
if (action == null)
throw new NullPointerException("Action is null");
throw new IllegalArgumentException("Unknown action: " + action);
}
如果有很多枚举值,您可能希望用地图查找替换此处完成的顺序搜索。
然后您可以在 compare()
方法中使用它:
@Override
public int compare(String o1, String o2) {
return Integer.compare(MyActionEnum.fromAction(o1).ordinal(),
MyActionEnum.fromAction(o2).ordinal());
}