判定数据中是否包含某一属性的方法

简介: 判定数据中是否包含某一属性的方法


方法一、使用List

public static boolean useList(String[] arr, String targetValue) {

return Arrays.asList(arr).contains(targetValue);

}

方法二、使用Set

public static boolean useSet(String[] arr, String targetValue) {

Set<String> set = new HashSet<String>(Arrays.asList(arr));

return set.contains(targetValue);

}

方法三、使用循环判断

public static boolean useLoop(String[] arr, String targetValue) {

for(String s: arr){

    if(s.equals(targetValue)) {

        return true;

    }

}

return false;

}
方法四、使用Arrays.binarySearch()

public static boolean useArraysBinarySearch(String[] arr, String targetValue) {

int a =  Arrays.binarySearch(arr, targetValue);

if(a > 0) {

    return true;

}else {

    return false;

}

}
注意:Arrays.binarySearch()方法只能用于有序数组!!!

方法五、使用Apache Commons类库中的ArrayUtils

import org.apache.commons.lang3.ArrayUtils;

public static boolean useArrayUtils(String[] arr, String targetValue) {

return ArrayUtils.contains(arr,targetValue);

}
其实Apache Commons类库中的ArrayUtils的contains方法的源码也是使用循环判断的方式。

if(array == null) {

return -1;

} else {

if(startIndex < 0) {

startIndex = 0;

}


int i;

if(objectToFind == null) {

for(i = startIndex; i < array.length; ++i) {

if(array[i] == null) {

return i;

}

}

} else if(array.getClass().getComponentType().isInstance(objectToFind)) {

for(i = startIndex; i < array.length; ++i) {

if(objectToFind.equals(array[i])) {

return i;

}

}

}

return -1;

}
比较:我们可以通过下面的代码大概的得出各种方法的时间成本。基本思想就是从数组中查找某个值,数组的大小分别是5、1k、10k。这种方法得到的结果可能并不精确,但是是最简单清晰的方式。

public static void main(String[] args) {

String[] arr = new String[] {  "1",  "2", "3", "4", "5"};

/*

String[] arr = new String[1000];

for(int i=1;i<=1000;i++) {

arr[i-1]=String.valueOf(i);

}

*/

/*

String[] arr = new String[10000];

for(int i=1;i<=10000;i++) {

arr[i-1]=String.valueOf(i);

}

*/

//use list

long startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

    useList(arr, "5");

}

long endTime = System.nanoTime();

long duration = endTime - startTime;

System.out.println("useList:  " + duration / 1000000);


//use set

startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

    useSet(arr, "5");

}

endTime = System.nanoTime();

duration = endTime - startTime;

System.out.println("useSet:  " + duration / 1000000);


//use loop

startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

    useLoop(arr, "5");

}

endTime = System.nanoTime();

duration = endTime - startTime;

System.out.println("useLoop:  " + duration / 1000000);


//use Arrays.binarySearch()

startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

    useArraysBinarySearch(arr, "5");

}

endTime = System.nanoTime();

duration = endTime - startTime;

System.out.println("useArrayBinary:  " + duration / 1000000);


//use useArrayUtils

startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

    useArrayUtils(arr, "5");

}

endTime = System.nanoTime();

duration = endTime - startTime;

System.out.println("useArrayUtils:  " + duration / 1000000);

}
当数组长度为5时,运行结果如下:

当数组长度为1k时,运行结果如下:

当数组长度为10k时,运行结果如下:

总结:

显然,使用一个简单的循环方法比使用任何集合都更加高效。

大多数人为了方便,都使用第一种方法,但是他的效率相对较低。因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。

如果使用Arrays.binarySearch()方法,数组必须是已排序的。所以当数组并没有进行排序,所以该方法不可使用。

相关文章
|
26天前
|
前端开发 开发者 数据格式
|
算法 安全 机器人
算法提高:计算几何基础 | 判断包含关系
计算几何是计算机科学的一个重要分支,主要研究几何形体的数学描述和计算机描述,在现代工程和数学领域,以及计算机辅助设计、地理信息系统、图形学、机器人技术、超大规模集成电路设计和统计等诸多领域都有重要的用途。在 ACM 竞赛中,出题相对独立,曾出现过与图论、动态规划相结合的题,大多数计算几何问题用程序实现都比较复杂。常用算法包括经典的凸包求解、离散化及扫描线算法、旋转卡壳、半平面交等。本文介绍计算几何常用算法——包含关系。
142 0
判断两棵树是否完全一致
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
110 0
|
存储 安全 PHP
类型判定| 学习笔记
快速学习类型判定。
Excel 技术篇-跨页签统计某一区域下符合条件值的数量方法,COUNTIF函数、数量统计公式的用法实例演示
Excel 技术篇-跨页签统计某一区域下符合条件值的数量方法,COUNTIF函数、数量统计公式的用法实例演示
367 0
Excel 技术篇-跨页签统计某一区域下符合条件值的数量方法,COUNTIF函数、数量统计公式的用法实例演示
|
算法 Java
灵魂拷问:如何检查Java数组中是否包含某个值 ?(2)
灵魂拷问:如何检查Java数组中是否包含某个值 ?
147 0
|
Java 程序员
灵魂拷问:如何检查Java数组中是否包含某个值 ?(1)
灵魂拷问:如何检查Java数组中是否包含某个值 ?
157 0
|
算法 Java 程序员
灵魂拷问:如何检查Java数组中是否包含某个值 ?
在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题。比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下。 另外,我想要告诉大家的是,作为程序员,我们千万不要轻视这些基础的知识点。因为基础的知识点是各种上层技术共同的基础,只有彻底地掌握了这些基础知识点,才能更好地理解程序的运行原理,做出更优化的产品。 我曾在某个技术论坛上分享过一篇非常基础的文章,结果遭到了无数的嘲讽:“这么水的文章不值得分享。”我点开他的头像进入他的主页,发现他从来没有分享过一篇文章,不过倒是在别人的博客下面留下过不少的足迹,大多数都是冷嘲热讽。我就纳闷了
186 0
|
SQL BI 关系型数据库
参数为空取全部数据的几种做法
当通过多个参数对数据进行过滤并且不选择某个参数时,希望依然能够查询出其他带条件的数据,也就是参数为空时忽略掉该条件,点击 <a href="http://c.raqsoft.com.cn/article/1543386793666?r=IBelieve" target="_blank" rel="n...
1003 0
|
Java Scala
slick对超过22个属性的表进行映射的两种办法
版权声明:本文为博主原创文章,未经博主允许不得转载 slick是scala的一个FRM(Functional Relational Mapper)框架,即函数式的关系数据库编程工具库。使用slick不同于使用java的hibernate或者是mybatis,对其进行迭代开发非常方便,因为其对表的映射基于函数式的编程方式。
1111 0