我有一个String[],其值如下:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
给定字符串s,是否有一种测试VALUES是否包含s的好方法?
我有一个String[],其值如下:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
给定字符串s,是否有一种测试VALUES是否包含s的好方法?
当前回答
在Java 8中,使用Streams。
List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
其他回答
Arrays.asList(yourArray).contains(yourValue)
警告:这对基元数组无效(请参见注释)。
从java-8开始,您现在可以使用Streams。
String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);
要检查int、double或long数组是否包含值,请分别使用IntStream、DoubleStream或LongStream。
实例
int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
可以使用Arrays类对值执行二进制搜索。如果数组未排序,则必须使用同一类中的排序函数对数组进行排序,然后对其进行搜索。
对于有限长度的阵列,请使用以下内容(由camickr提供)。这对于重复检查来说是缓慢的,特别是对于较长的阵列(线性搜索)。Arrays.asList(…).incontains(…)如果您重复检查一组较大的元素,则可获得快速性能数组结构错误。使用TreeSet并将每个元素添加到其中。它对元素进行排序,并具有快速的exist()方法(二进制搜索)。如果元素实现Comparable,则需要对TreeSet进行相应排序:ElementClass.compareTo()方法必须与ElementClass.equals()兼容:是否看到三合会未出现战斗?(Java Set缺少项目)TreeSet myElements=新TreeSet();//对每个元素执行此操作(实现*可比*)myElements.add(nextElement);//*或者*,如果从其他代码强制提供数组:myElements.addAll(Arrays.asList(myArray));否则,请使用您自己的比较器:类MyComparator实现Comparator<ElementClass>{int compareTo(ElementClass元素1;ElementClass元素2){//元素的比较//应与对象相等性一致}布尔等于(对象otherComparator){//您的比较器相等}}//用比较器构造TreeSetTreeSet myElements=新TreeSet(新MyComparator());//对每个元素执行此操作(实现*可比*)myElements.add(nextElement);回报:检查某些元素的存在://通过排序元素进行快速二进制搜索(性能~日志(大小)):boolean containsElement=myElements.exists(someElement);
使用以下方法(在本代码中contains()方法是ArrayUtils.in()):
对象Utils.java
public class ObjectUtils {
/**
* A null safe method to detect if two objects are equal.
* @param object1
* @param object2
* @return true if either both objects are null, or equal, else returns false.
*/
public static boolean equals(Object object1, Object object2) {
return object1 == null ? object2 == null : object1.equals(object2);
}
}
阵列应用程序.java
public class ArrayUtils {
/**
* Find the index of of an object is in given array,
* starting from given inclusive index.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @param start The index from where the search must start.
* @return Index of the given object in the array if it is there, else -1.
*/
public static <T> int indexOf(final T[] ts, final T t, int start) {
for (int i = start; i < ts.length; ++i)
if (ObjectUtils.equals(ts[i], t))
return i;
return -1;
}
/**
* Find the index of of an object is in given array, starting from 0;
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return indexOf(ts, t, 0)
*/
public static <T> int indexOf(final T[] ts, final T t) {
return indexOf(ts, t, 0);
}
/**
* Detect if the given object is in the given array.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return If indexOf(ts, t) is greater than -1.
*/
public static <T> boolean in(final T[] ts, final T t) {
return indexOf(ts, t) > -1;
}
}
正如您在上面的代码中看到的,还有其他实用方法ObjectUtils.equals()和ArrayUtils.indexOf(),它们也在其他地方使用。
值得一提的是,我进行了一次测试,比较了3个速度建议。我生成了随机整数,将它们转换为字符串并添加到数组中。然后我搜索了可能最高的数字/字符串,这对于asList().contains()来说是最坏的情况。
使用10K阵列大小时,结果是:
Sort & Search : 15
Binary Search : 0
asList.contains : 0
当使用100K阵列时,结果是:
Sort & Search : 156
Binary Search : 0
asList.contains : 32
因此,如果数组是按排序顺序创建的,那么二进制搜索是最快的,否则asList().concludes将是最好的方法。如果您有很多搜索,那么对数组进行排序可能是值得的,这样您就可以使用二进制搜索。这取决于您的应用程序。
我认为这是大多数人所期望的结果。以下是测试代码:
import java.util.*;
public class Test {
public static void main(String args[]) {
long start = 0;
int size = 100000;
String[] strings = new String[size];
Random random = new Random();
for (int i = 0; i < size; i++)
strings[i] = "" + random.nextInt(size);
start = System.currentTimeMillis();
Arrays.sort(strings);
System.out.println(Arrays.binarySearch(strings, "" + (size - 1)));
System.out.println("Sort & Search : "
+ (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
System.out.println(Arrays.binarySearch(strings, "" + (size - 1)));
System.out.println("Search : "
+ (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
System.out.println(Arrays.asList(strings).contains("" + (size - 1)));
System.out.println("Contains : "
+ (System.currentTimeMillis() - start));
}
}