【问题标题】:Does Java have a "IN" operator or function like SQL? [duplicate]Java 是否有“IN”运算符或类似 SQL 的函数? [复制]
【发布时间】:2011-04-03 17:12:53
【问题描述】:

我想知道在 Java 中是否有这样的方法:

if(word in stringArray) {
  ...
}

我知道我可以为此创建一个函数,但我只想知道 Java 是否已经为此提供了一些功能。

谢谢!

【问题讨论】:

  • 请告诉我们stringArray的类型。

标签: java function


【解决方案1】:

没有数组:

public static <T> boolean in(T value, T... list) {
    for (T item : list) {
        if (value.equals(item))
            return true;
    }
    return false;
}

用法:

int val = 1;
assert in(val, 1,2,3,4);

【讨论】:

【解决方案2】:

在 SQL 中

x in ('Alice', 'Bob', 'Carol')

在 Java 中:

Arrays.asList("Alice", "Bob", "Carol").contains(x)

【讨论】:

    【解决方案3】:
    tabs[j].indexOf("lelamondeestgrand...")!=0
    

    【讨论】:

    • 我想你在这里漏掉了一点:stringArray 是一个 String 的数组,而不仅仅是一个 String,所以 indexOf 方法不存在。
    【解决方案4】:

    您可以将 java.util.Collection.contains() 用于集合。如果你有一个非空数组,你可以使用 java.util.Arrays.asList(array).contains()。

    【讨论】:

      【解决方案5】:

      Java 语言的设计既强大又简单。 Java 在语言级别上没有这样的运算符,但肯定已经编写了库来促进这样的查询。

      如果您想知道某个对象是否是某个对象集的成员,那么您应该使用 -- 还有什么? -- Set,而不是数组。这些数据结构自然允许此类查询,更好的是,它们针对此类查询进行了优化

      您可以像这样轻松检查给定字符串是否在 Set&lt;String&gt; 中:

          String[] arr = { "Alice", "Bob", "Carol" };
          Set<String> names = new HashSet<String>(Arrays.asList(arr));
      
          System.out.println(names.contains("Alice")); // true
          System.out.println(names.contains("Dean")); // false
      

      使用HashSetcontains 是一个常数时间操作。这比通过数组进行线性搜索要好得多。

      您应该熟悉 Java 集合框架为您提供的数据结构。它们使您可以编写惯用的、可维护的、灵活的代码,并得到这些数据结构可用的许多强大算法的支持。

      另见

      【讨论】:

        【解决方案6】:

        它首先取决于数组是什么数组。如果它是精确单词的数组,您可以将其转换为常规集合并使用 contains() 方法。如果它是一组句子或短语等,则必须对其进行迭代才能分辨。

        捕获所有这些的最通用的解决方案是如下迭代。

        for(String s : stringArray)
        {
          if(s.indexOf(word) > 0) return true;
        }
        return false;
        

        这会查看数组中的每个字符串,并检查单词是否包含在其中的任何位置。找到第一次出现后返回true。

        【讨论】:

          【解决方案7】:

          请向我们详细说明您的问题是什么样的,以及您需要检查的内容。有几种不同的方法可以做这样的事情。如果您需要继续询问项目 A 是否在集合 B.. 将集合 B 设为 HashSet,您可以非常快速地调用包含。您可以通过几种 java-ish 方式获得相同的效果,但它们会根据您的数据等而有所不同。

          【讨论】:

            【解决方案8】:

            有很多集合可以让你做类似的事情。例如:

            Strings:

            String s = "I can has cheezeburger?";
            boolean hasCheese = s.contains("cheeze");
            

            Collections:

            List<String> listOfStrings = new ArrayList<String>();
            boolean hasString = listOfStrings.contains(something);
            

            但是,对于简单的String[],没有类似的构造。

            【讨论】:

            • 未排序的列表对于包含来说很慢,如果你可以做一个 HashSet 你会做得更好
            • @bwawok,好吧,如果O(n) 对你来说很慢,那就很慢了。但是,它将与数组的任何 contains 方法一样快。
            • 我将使用 ArrayList,它只包含一个表单中的 5 个字符串。谢谢!
            • @bwawok,好吧,如果元素没有任何顺序,并且您所拥有的只是一个开始的列表,那么这是最好的情况。我同意,如果你可以使用任何其他数据结构O(n) stinks。
            • 如果你有String[],你可以使用Arrays.asList(array).contains(element);
            【解决方案9】:
            if(myArrayList.contains("hello"))
            {
                // yay
            }
            

            【讨论】:

              【解决方案10】:

              如果数组已排序,则可以使用Arrays.binarySearch查找数据。

              像这样:

                 if (Arrays.binarySearch(stringArray, word)>=0)  {
                   // word found in the array.
                 }
              

              如果数组未排序,commons lang 有ArrayUtils.indexOf 方法。

              最后,如果您正在搜索大型数组,那么使用来自 JSR166 的 ParallelArray 进行并行搜索可能是值得的 - 来自 Java SE 7,现在可以下载。 This article做介绍。

              【讨论】:

                【解决方案11】:

                Java 没有“in”运算符。

                对于数组,您需要对其进行迭代并查找匹配项。

                对于列表,您可以使用contains 方法。

                【讨论】:

                • 您不需要手动执行此操作,Arrays.binarySearch() 有帮助
                • @Colin,二分查找仅在数组排序后有效。
                猜你喜欢
                • 2014-06-20
                • 2012-12-15
                • 1970-01-01
                • 1970-01-01
                • 2014-08-20
                • 1970-01-01
                • 1970-01-01
                • 2011-07-25
                • 2020-04-24
                相关资源
                最近更新 更多