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<String>
中:
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
使用HashSet
、contains
是一个常数时间操作。这比通过数组进行线性搜索要好得多。
您应该熟悉 Java 集合框架为您提供的数据结构。它们使您可以编写惯用的、可维护的、灵活的代码,并得到这些数据结构可用的许多强大算法的支持。
另见
Java Tutorials/Collections FrameworkList<E>
、Set<E>
、Queue<E>
、Map<K,V>
、SortedMap<K,V>
、NavigableSet<E>
等
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”条件?