TreeSet myElements = new TreeSet();
// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
// *Alternatively*, if an array is forceably provided from other code:
myElements.addAll(Arrays.asList(myArray));
否则,用你自己的 Comparator :
class MyComparator implements Comparator<ElementClass> {
int compareTo(ElementClass element1; ElementClass element2) {
// Your comparison of elements
// Should be consistent with object equality
}
boolean equals(Object otherComparator) {
// Your equality of comparators
}
}
// construct TreeSet with the comparator
TreeSet myElements = new TreeSet(new MyComparator());
// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
回报:检查某些元素的存在:
// Fast binary search through sorted elements (performance ~ log(size)):
boolean containsElement = myElements.exists(someElement);
29条答案
按热度按时间xvw2m8pv16#
javase9的简明更新
引用数组不正确。对于这个案子,我们要找的是一套。自从JavaSE9以来
Set.of
.给定字符串s,有没有一种测试值是否包含s的好方法
o(1)。
正确的类型,不可变,o(1)且简洁。很漂亮*
原始答案详细信息
首先要清除代码。我们已(更正):
这是一个可变的静态findbugs会告诉你是非常淘气。不要修改静态,也不要允许其他代码这样做。该字段至少应为私有字段:
(注意,您实际上可以将
new String[];
位。)引用数组仍然不好,我们需要一个集合:
)偏执的人,比如我,如果把这件事包起来,可能会觉得更自在
Collections.unmodifiableSet
-甚至可以公开。)(*对于品牌来说,collections api仍然缺少不可变的集合类型,语法仍然过于冗长,这是可以预见的
v6ylcynt17#
使用简单的循环是最有效的方法。
对programcreek的礼遇
umuewwlo18#
检查数组是否包含值的四种不同方法
使用
List
:使用
Set
:使用简单循环:
使用
Arrays.binarySearch()
:下面的代码是错误的,为了完整起见,这里列出了它。
binarySearch()
只能用于排序数组。你会发现下面的结果很奇怪。这是排序数组时的最佳选项。快速示例:
czq61nw119#
警告:这不适用于基元数组(请参阅注解)。
由于java-8,您现在可以使用流了。
检查
int
,double
或者long
包含值使用IntStream
,DoubleStream
或者LongStream
分别。示例
ej83mcc020#
不必使用快速数组初始化语法,您可以直接使用arrays.aslist方法以类似的方式将其初始化为列表,例如:
然后你可以做(如上所述):
jxct1oxe21#
对于长度有限的数组,请使用以下命令(由camickr给出)。这对于重复检查来说很慢,尤其是对于较长的数组(线性搜索)。
如果您反复检查一组较大的元素,则可以获得快速性能
数组是错误的结构。使用
TreeSet
并将每个元素添加到其中。它对元素进行排序并具有快速响应exist()
方法(二进制搜索)。如果元素实现
Comparable
&你想要那个TreeSet
相应排序:ElementClass.compareTo()
方法必须与兼容ElementClass.equals()
:看到三合会没有出现打架吗(java集(缺少项)否则,用你自己的
Comparator
:回报:检查某些元素的存在:
iaqfqrcu22#
使用Java8,您可以创建一个流并检查流中是否有匹配的条目
"s"
:或作为通用方法:
kknvjkwl23#
可以使用arrays类对值执行二进制搜索。如果数组没有排序,则必须使用同一类中的排序函数对数组进行排序,然后在其中进行搜索。
zzoitvuj24#
实际上,如果像tom hawtin建议的那样使用hashset,就不必担心排序问题,而且您的速度与预排序数组上的二进制搜索相同,甚至可能更快。
显然,这完全取决于代码的设置方式,但从我的立场来看,顺序是:
在未排序的数组上:
容器
aslist公司
排序二进制(&B)
在排序数组上:
容器
二元的
aslist公司
所以不管怎样,我都会赢的。
o7jaxewo25#
一种可能的解决方案:
arknldoa26#
obstupidanswer(但我认为在这里有一个教训):
3yhwsihp27#
你可以用
ArrayUtils.contains
来自apache commons langpublic static boolean contains(Object[] array, Object objectToFind)
请注意,此方法返回false
如果传递的数组是null
.还有一些方法可用于各种基本数组。
示例:
polkgigr28#
如果你有googlecollections库,tom的答案可以通过使用immutableset简化很多(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/immutableset.html)
这确实消除了初始化过程中的大量混乱
1wnzp6jl29#
值得一提的是,我做了一个测试,比较了3个关于速度的建议。我生成了随机整数,将它们转换成字符串并将它们添加到数组中。然后,我搜索了可能的最高数字/字符串,这对于
asList().contains()
.当使用10k数组大小时,结果是:
使用100k阵列时,结果是:
因此,如果按排序顺序创建数组,则二进制搜索速度最快,否则
asList().contains
会是最好的选择。如果您有许多搜索,那么对数组进行排序可能是值得的,这样您就可以使用二进制搜索。这完全取决于你的申请。我认为这是大多数人所期待的结果。测试代码如下: