34
A
回答
43
所有的Java枚舉實現可比:http://java.sun.com/javase/6/docs/api/java/lang/Enum.html
您還可以使用ordinal
方法把它們變成int
s,則比較是微不足道的。
if (ErrorLevel.ERROR.compareTo(someOtherLevel) <= 0) {
...
}
8
假設您已經按嚴重性的順序定義了它們,您可以比較每個值的序號。序數是它在枚舉聲明中的位置,初始常量的賦值是0的序數。
通過調用值的ordinal方法獲得序號。
5
我想檢查錯誤級別是'錯誤還是以上'。
這樣的枚舉應該有一個關聯的級別。所以要找到等於或大於你應該比較的水平。
使用序號依賴枚舉值的顯示順序。如果你依賴這個,你應該記錄它,否則這種依賴會導致代碼變得脆弱。
1
另一種選擇是
enum Blah {
A(false), B(false), C(true);
private final boolean isError;
Blah(boolean isErr) {isError = isErr;}
public boolean isError() { return isError; }
}
從你的問題,我假設你正在使用枚舉指定某種返回值的,其中有一些是錯誤狀態。這種實現的優點是不必在特定的地方添加新的返回類型(然後調整測試值),但缺點是需要一些額外的工作來初始化枚舉。
追求我的假設更進一步,是用戶的錯誤代碼的東西?一個調試工具?如果是後者,我發現異常處理系統對於Java來說非常合適。
17
這是更爲傳神一個版本將是
myError.isErrorOrAbove(otherError)
或
myError.isWorseThan(otherError)
這樣你可以定義枚舉內的順序,如果你喜歡可以在內部改變實現。現在,Enum的客戶端可以在不知道任何細節的情況下比較值。
一個可能的實現是對子級
public enum ErrorLevel {
INFO(0),
WARN(1),
ERROR(2),
FATAL(3);
private Integer severity;
ErrorLevel(int severity) {
this.severity = severity;
}
public boolean isWorseThan(ErrorLevel other) {
return this.severity > other.severity;
}
}
我也不會建議使用有序()方法進行比較,因爲當有人改變了枚舉值的定義,你可以得到意外的行爲順序。
3
爪哇枚舉已經建立在compareTo(..)方法,它使用枚舉位置(又名有序)到一個對象比其他。該位置基於枚舉常量被聲明爲 的順序確定,其中第一個常量被指定爲0的序數。
如果這種安排是不合適的,則可能需要通過增加內部磁場(S)來定義你自己的比較如下圖所示:
import java.util.Comparator;
public enum Day {
MONDAY(1, 3),
TUESDAY(2, 6),
WEDNESDAY(3, 5),
THURSDAY(4, 4),
FRIDAY(5, 2),
SATURDAY(6, 1),
SUNDAY(0, 0);
private final int calendarPosition;
private final int workLevel;
Day(int position, int level) {
calendarPosition = position;
workLevel = level;
}
int getCalendarPosition(){ return calendarPosition; }
int getWorkLevel() { return workLevel; }
public static Comparator<Day> calendarPositionComparator = new Comparator<Day>() {
public int compare(Day d1, Day d2) {
return d1.getCalendarPosition() - d2.getCalendarPosition();
}
};
public static Comparator<Day> workLevelComparator = new Comparator<Day>() {
public int compare(Day d1, Day d2) {
// descending order, harder first
return d2.getWorkLevel() - d1.getWorkLevel();
}
};
}
驅動程序,檢查所有作品:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class EnumTest
{
public static void main (String[] args) {
List<Day> allDays = Arrays.asList(Day.values());
System.out.println("===\nListing days in order of calendar position:");
Collections.sort(allDays, Day.calendarPositionComparator);
showItems(allDays);
System.out.println("===\nListing days in order of work level:");
Collections.sort(allDays, Day.workLevelComparator);
showItems(allDays);
}
public static void showItems(List<Day> days) {
for (Day day : days) {
System.out.println(day.name());
}
}
}
相關問題
- 1. 比較枚舉值
- 2. 如何比較枚舉值?
- 3. 與枚舉值JSTL比較
- 4. 如何比較XML枚舉和Java枚舉?
- 5. 在java中比較枚舉類型
- 6. 比較枚舉條目 - Java的
- 7. 如何比較NSPersistentStoreUbiquitousTransitionType枚舉值
- 8. 比較時選擇多個枚舉值
- 9. 枚舉類型值不比較正確
- 10. 比較IronPython中的枚舉值
- 11. 比較排序的枚舉值
- 12. 比較C#/ Unity中的枚舉值?
- 13. C#枚舉標誌比較
- 14. 比較一個JsonArray枚舉
- 15. 比較對象枚舉
- 16. 比較枚舉與iteratee包
- 17. jsp。枚舉比較/平等
- 18. 比較SpEL中的枚舉
- 19. 紅寶石「枚舉」比較
- 20. MySQL的比較枚舉
- 21. 比較嵌套枚舉
- 22. 如何比較相同枚舉的值? (==比較不起作用!)
- 23. Java枚舉值
- 24. 我可以啓用警告來比較枚舉值和非枚舉值嗎?
- 25. Java自定義枚舉值枚舉
- 26. 簡單的比較,如果枚舉是枚舉
- 27. 我如何組合枚舉比較實際的枚舉
- 28. 比較枚舉int,日曆類
- 29. 斯卡拉匹配/比較枚舉
- 30. FluentAssertion無法比較枚舉字符串
這不是真的一個枚舉,顯然。但它有一個方法'isGreaterOrEqual()' – ripper234 2009-07-19 11:33:43
@ ripper234:你的問題說「枚舉」 – 2011-05-27 13:48:48