Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在静态最终字符串列表中查找项_Java_String_Static - Fatal编程技术网

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);