Java 在静态最终字符串列表中查找项
我有一个静态字符串列表:Java 在静态最终字符串列表中查找项,java,string,static,Java,String,Static,我有一个静态字符串列表: static final String FOO = "foo"; static final String BAR = "bar"; static final String DUH = "DUH"; static final String GOO = "goo"; static final String ZUT = "zut"; 我想检查一个给定的字符串是否是这个列表的一部分,但我想单独保留每个项目的可能性引用。我希望检查实现不知道各个项目。所以不是这样的: boole
static final String FOO = "foo";
static final String BAR = "bar";
static final String DUH = "DUH";
static final String GOO = "goo";
static final String ZUT = "zut";
我想检查一个给定的字符串是否是这个列表的一部分,但我想单独保留每个项目的可能性引用。我希望检查实现不知道各个项目。所以不是这样的:
boolean isValid(String item) {
return (item.equalsIgnoreCase(FOO) || item.equalsIgnoreCase(BAR) || ......)
}
Thnx!
Bas Hendriks创建一个包含所有字符串的数组,并使用for循环检查其中一个字符串是否与输入字符串匹配。根据您的约束,您应该使用集合或映射 A.设置stringSet使用stringSet.containsfoo检查字符串是否存在于集合中 B.映射stringMap并使用stringMap.containsKeyfoo检查该字符串是否存在于映射中 创建要签入的最终不可变字符串集:
private static final Set<String> STRINGS =
Collections.unmodifiableSet(new HashSet<String>(
Arrays.asList("foo", "bar", "DUH", "goo", "zut"));
public boolean isValid(String input) {
return STRINGS.contains(input);
}
如果您仅限于Java1.4,那么只需删除所有泛型,它仍应以相同的方式工作
如果您已经使用或愿意包含它,那么您可以使该定义稍微好一点,Guava需要Java 1.5或更高版本,但是:
private static final Set<String> STRINGS = ImmutableSet.of("foo", "bar", "DUH", "goo", "zut");
另一种方法:使用静态方法创建枚举以检查项是否有效:
enum MyEnum {
FOO("foo"),
BAR("bar"),
DUH("DUH");
private static final EnumSet<MyEnum> set = EnumSet.allOf(MyEnum.class);
private String name;
MyEnum(String name) {
this.name = name;
}
public static boolean isValid(String item) {
for (MyEnum e : set) {
if (e.name.equalsIgnoreCase(item)) {
return true;
}
}
return false;
}
}
反思。收集类中声明的所有静态最终字符串字段,并构建一个集合。如果这些常量彼此有连接,您可能希望使用枚举而不是一组单独的静态最终变量。@jesper我仅限于java 1.4,因此没有枚举对于1.5 java之前的版本,有一个类型安全的枚举模式,这是针对这些情况的。在这种情况下,可以在类中保留有效标识符集,并在其中添加isValid方法。很好地封装了.java1.4?可怜的你,这是一个古老的、早就被下线了的问题。然而,问题中应该注意到这样一个限制,因为幸运的是,现在它非常不标准。你通常不使用数组来查找某些内容,因为这是一个Olog-n搜索,而集合将具有O1行为。对于数量较少的项目,这可能没什么大不了的,但如果数量不断增加,如果您用集合或类似的方式支持集合,则不会导致令人不快的惊喜。@Big-Oh符号与此无关。它并没有说要更快或更慢。它表示算法执行时间的增长速度。如果数据结构良好的哈希表和树比OP案例的线性搜索速度更快,我会感到惊讶。很明显,OP在代码中输入时只处理少量元素。否则,他就不需要单独访问它们了。几乎没有任何理由存储主要在数组中查找的数据。你不知道他有多少常数。他很可能正在生成所有可能的TLA,或者从一个文件中加载数百个用于查找。这个数字可能会从现在的10个常数增加到将来的100个。也许查找每秒发生数千次。最重要的是,就代码行而言,集合查找比数组上的循环要短。@mehrdad我不想使用它,因为我正在寻找一个不包含单个项的检查function。当我添加一个额外的项时,我必须在数组中添加相同的项。@Bas:如果你不能使用枚举,那么你很难在两个地方添加内容。您可以通过向集合中添加常量名称而不是字符串来稍微改进它
MyEnum.isValid(item);