Java 是不是有“IN”运算符或类似 SQL 的函数? [复制]

Posted

技术标签:

【中文标题】Java 是不是有“IN”运算符或类似 SQL 的函数? [复制]【英文标题】: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的类型。 【参考方案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);

【讨论】:

刚发现这个问题:Java in operator【参考方案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 集合框架为您提供的数据结构。它们使您可以编写惯用的、可维护的、灵活的代码,并得到这些数据结构可用的许多强大算法的支持。

另见

Java Tutorials/Collections Framework List&lt;E&gt;Set&lt;E&gt;Queue&lt;E&gt;Map&lt;K,V&gt;SortedMap&lt;K,V&gt;NavigableSet&lt;E&gt;Effective Java 2nd Edition,Item 25:Prefer lists to arrays

【讨论】:

【参考方案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,二分查找仅在数组排序后有效。

以上是关于Java 是不是有“IN”运算符或类似 SQL 的函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中,是不是有类似“IN”的东西,但是对于多个“AND”条件?

Django:ORM 是不是支持 SQL“IN”运算符?

在 Python 中是不是有“in”运算符的函数

类似于 PL/SQL 中的 += 或 .= 的运算符?

SQL --------------- 运算符 = 与 in

判断包含字符串,有没有类似sql中的 in的函数