精华内容
下载资源
问答
  • 如何检查数组(未排序)中是否包含某个值 ?这是一个非常有用并且经常使用的操作。我想大家的脑海中应该已经浮现出来了几种解决方案,这些方案的时间复杂度可能大不相同。我先来提供四种不同的方法,大家看看是否高效...
    • 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够?

    如何检查数组(未排序)中是否包含某个值 ?这是一个非常有用并且经常使用的操作。我想大家的脑海中应该已经浮现出来了几种解决方案,这些方案的时间复杂度可能大不相同。

    我先来提供四种不同的方法,大家看看是否高效。

    f935c447e74a68848ada4d90a316d25e.png

    1)使用 List

    public static boolean useList(String[] arr, String targetValue) {    return Arrays.asList(arr).contains(targetValue);}

    Arrays 类中有一个内部类 ArrayList(可以通过 Arrays.asList(arr) 创建该实例),其 contains() 方法的源码如下所示。

    public boolean contains(Object o) {    return indexOf(o) != -1;}public int indexOf(Object o) {    E[] a = this.a;    if (o == null) {        for (int i = 0; i 

    从上面的源码可以看得出,contains() 方法调用了 indexOf() 方法,如果返回 -1 则表示 ArrayList 中不包含指定的元素,否则就包含。其中 indexOf() 方法用来获取元素在 ArrayList 中的下标,如果元素为 null,则使用“==”操作符进行判断,否则使用 equals() 方法进行判断。

    PS:关于“==”操作符和 equals() 方法,可以参照我另外一篇文章《如何比较 Java 的字符串?》

    2)使用 Set

    public static boolean useSet(String[] arr, String targetValue) {    Set set = new HashSet(Arrays.asList(arr));    return set.contains(targetValue);}

    HashSet 其实是通过 HashMap 实现的,当使用 new HashSet(Arrays.asList(arr)) 创建并初始化了 HashSet 对象后,其实是在 HashMap 的键中放入了数组的值,只不过 HashMap 的值为默认的一个摆设对象。大家感兴趣的话,可以查看一下 HashSet 的源码。

    我们来着重看一下 HashSet 的 contains() 方法的源码。

    public boolean contains(Object o) {    return map.containsKey(o);}public boolean containsKey(Object key) {    return getNode(hash(key), key) != null;}

    从上面的源码可以看得出,contains() 方法调用了 HashMap 的 containsKey() 方法,如果指定的元素在 HashMap 的键中,则返回 true;否则返回 false。

    3)使用一个简单的循环

    public static boolean useLoop(String[] arr, String targetValue) {    for (String s : arr) {        if (s.equals(targetValue))            return true;    }    return false;}

    for-each 循环中使用了 equals() 方法进行判断——这段代码让我想起了几个词,分别是简约、高效、清晰。

    4)使用 Arrays.binarySearch()

    public static boolean useArraysBinarySearch(String[] arr, String targetValue) {    int a = Arrays.binarySearch(arr, targetValue);    if (a > 0)        return true;    else        return false;}

    不过,binarySearch() 只适合查找已经排序过的数组。

    由于我们不确定数组是否已经排序过,所以我们先来比较一下前三种方法的时间复杂度。由于调用 1 次的时间太短,没有统计意义,我们就模拟调用 100000 次,具体的测试代码如下所示。

    String[] arr = new String[]{"沉", "默", "王", "二", "真牛逼"};// 使用 Listlong startTime = System.nanoTime();for (int i = 0; i 

    PS:nanoTime() 获取的是纳秒级,这样计算的时间就更精确,最后除以 1000000 就是毫秒。换算单位是这样的:1秒=1000毫秒,1毫秒=1000微秒,1微秒=1000纳秒。

    统计结果如下所示:

    useList:  6useSet:  40useLoop:  2

    假如把数组的长度增加到 1000,我们再来看一下统计结果。

    String[] arr = new String[1000];Random s = new Random();for(int i=0; i

    这时数组中是没有我们要找的元素的。为了做比较,我们顺便把二分查找也添加到统计项目中。

    // 使用二分查找startTime = System.nanoTime();for (int i = 0; i 

    统计结果如下所示:

    useList:  91useSet:  1460useLoop:  70useArraysBinarySearch:  4

    我们再把数组的长度调整到 10000。

    String[] arr = new String[10000];Random s = new Random();for(int i=0; i

    统计结果如下所示:

    useList:  1137useSet:  15711useLoop:  1115useArraysBinarySearch:  5

    从上述的统计结果中可以很明显地得出这样一个结论:使用简单的 for 循环,效率要比使用 List 和 Set 高。这是因为把元素从数组中读出来再添加到集合中,就要花费一定的时间,而简单的 for 循环则省去了这部分时间。

    在得出这个结论之前,说实话,我最喜欢的方式其实是第一种“使用 List”,因为只需要一行代码 Arrays.asList(arr).contains(targetValue) 就可以搞定。

    虽然二分查找(Arrays.binarySearch())花费的时间明显要少得多,但这个结论是不可信的。因为二分查找明确要求数组是排序过的,否则查找出的结果是没有意义的。可以看一下官方的 Javadoc。

    Searches the specified array for the specified object using the binary search algorithm. The array must be sorted into ascending order according to the natural ordering of its elements (as by the sort(Object []) method) prior to making this call. If it is not sorted, the results are undefined.

    实际上,如果要在一个数组或者集合中有效地确定某个值是否存在,一个排序过的 List 的算法复杂度为 O(logn),而 HashSet 则为 O(1)。

    我们再来发散一下思维:怎么理解 O(logn) 和 O(1) 呢?

    O(logn) 的算法复杂度,比较典型的例子是二分查找。举个例子,假设现在一堆试卷,已经按照分数从高到底排列好了。现在要查找有没有 79 分的试卷,怎么办呢?可以先从中间找起,因为按照 100 分的卷子来看,79 分大差不差应该就在中间的位置(平均分如果低于 79 说明好学生就比较少了),如果中间这份卷子的分数是 83,那说明 79 分的卷子就在下面的一半,这时候可以把上面那半放在一边了。然后按照相同的方式,每次就从中间开始找,直到找到 79 分的卷子(当然也可能没有 79 分)。

    假如有 56 份卷子,找一次,还剩 28 份,再找一次,还剩 14 份,再找一次,还剩 7 份,再找一次,还剩 2 或者 3 份。如果是 2 份,再找一次,就只剩下 1 份了;如果是 3 份,就还需要再找 2 次。

    我们知道,log2(32) = 5,log2(64) = 6,而 56 就介于 32 和 64 之间。也就是说,二分查找大约需要 log2(n) 次才能“找到”或者“没找到”。而在算法复杂度里,经常忽略常数,所以不管是以 2 为底数,还是 3 为底数,统一写成 log(n) 的形式。

    再来说说 O(1),比较典型的例子就是哈希表(HashSet 是由 HashMap 实现的)。哈希表是通过哈希函数来映射的,所以拿到一个关键字,通过哈希函数转换一下,就可以直接从表中取出对应的值——一次直达。

    作者:沉默王二
    原文链接:https://juejin.im/post/5df83e7be51d4557f638b769

    展开全文
  • 今天发现一个怪问题,同样是.net3.5环境下的两个项目,一个里支持arr.contains("1"),一个就不支持,代码完全相同也不行.有时在不支持项目里加新文件支持,但有时又不支持,发现在支持的项目里contains的注释是方法,但是查...
    
    

    今天发现一个怪问题,同样是.net3.5环境下的两个项目,一个里支持arr.contains("1"),一个就不支持,代码完全相同也不行.有时在不支持项目里加新文件支持,但有时又不支持,发现在支持的项目里contains的注释是<extension>方法,但是查不出在哪定义的.

    在网上查到一段代码,虽然和这不太一样,但是可以使数组使用contains

    数组有Contains方法,在.NET Framework 2.0 版中,Array 类实现ICollection<T>接口,但必须如下书写代码:

    1.string[] ss = new string[] { "1", "2" };
    2.bool b = (ss as ICollection<string>).Contains("1");


    MSDN中说明如下:
    在.NET Framework 2.0 版中,Array 类实现 System.Collections.Generic.IList<T>、System.Collections.Generic.ICollection<T> 和 System.Collections.Generic.IEnumerable<T> 泛型接口。由于实现是在运行时提供给数组的,因而对于文档生成工具不可见。因此,泛型接口不会出现在 Array 类的声明语法中,也不会有关于只能通过将数组强制转换为泛型接口类型(显式接口实现)才可访问的接口成员的参考主题。将某一数组强制转换为这三种接口之一时需要注意的关键一点是,添加、插入或移除元素的成员会引发 NotSupportedException。

    下例的第二种方法是上文里讲到的三种方法之一.

    C#中怎么判断一个数组中是否存在某个数组值

    (1) 第一种方法:

    int[] ia = {1,2,3};
    int id = Array.IndexOf(ia,1); // 这里的1就是你要查找的值
    if(id==-1)
    // 不存在
    else
    // 存在

    (2) 第二种方法:

    string[] strArr = {"a","b","c","d","e"};
    bool exists = ((IList)strArr).Contains("a");
    if(exists)
    // 存在
    else
    // 不存在

    注意: 用IList需要using System.Collections;

    展开全文
  • PHP 判断二维数组中是否含有某个值

    千次阅读 2019-10-13 03:25:37
    主要是因为用mysqli_fetch_all() 这函数返回的数组是数字索引的二维数组,时候我们需要判断一个主键是否在这个二维数组中就会遇到一些麻烦,常见的做法就是写循环判断,但是如果需要判断多次的情况下,我们循环...

    主要是因为用 mysqli_fetch_all() 这函数返回的数组是数字索引的二维数组,有时候我们需要判断一个主键是否在这个二维数组中就会遇到一些麻烦,常见的做法就是写循环判断,但是如果需要判断多次的情况下,我们循环这么多次会大大降低脚本的性能,我们应该要如何改进?思路就是把子数组中的键值作为数组索引,然后直接用 if 或者 array_key_exists() 就可以判断了。

    <?php
    
    //数据库就不创建了,直接代码模拟。
    
    $data = [
    
              0 =>  [
                        'id' => 5698,
                        'first_name' => 'Bill',
                        'last_name' => 'Gates',
                    ],
        
              1 =>  [
                        'id' => 4767,
                        'first_name' => 'Steve',
                        'last_name' => 'Jobs',
                    ],
    
               2 => [
                        'id' => 3809,
                        'first_name' => 'Mark',
                        'last_name' => 'Zuckerberg',
                    ],
    
        ];
    
    //我们用 mysqli_fetch_all() 函数以后肯定会得到类似这样的数值索引二维函数。子数组先以关联数组演示。
    
    //方法一
    
    $arr = [];
    
    foreach( $data as $key => $value){
        $arr[$data[$key]['id']] = $value; 
    }
    
    echo '<pre>';
        print_r($arr);
    echo '<pre/>';
    
    /*
    
    输出数组
    
    Array
    (
        [5698] => Array
            (
                [id] => 5698
                [first_name] => Bill
                [last_name] => Gates
            )
    
        [4767] => Array
            (
                [id] => 4767
                [first_name] => Steve
                [last_name] => Jobs
            )
    
        [3809] => Array
            (
                [id] => 3809
                [first_name] => Mark
                [last_name] => Zuckerberg
            )
    
    )
    
    输出以ID为索引的二维数组成功。
    
    */
    
    /*
    
    方法二
    
    利用 array_column() 函数
    
    该函数返回输入的多维数组中所有子数组中的某个索引的值组成的数组。
    输入的必须是多维数组(关联数组和索引数组都可以),不然返回数组为空数组。
    子数组中的索引可以是字符串索引也可以是数字索引。
    第二个参数也可以是 NULL,此时将返回子数组中所有元素(配合 index_key 参数来重置数组键的时候,非常有用)。
    第三个参数可以规定该子数组某个索引(键名)的键值成为返回数组中的键值对的键名。
    
    返回数组的键值为输入的多维数组中子数组中的某个键名的键值,返回数组的键名按以下规则
    1.如果有第三个参数,则按第三个参数规定的值。
    2.如果第三个参数为空,返回数组的键名则是以 0 开始 的数字索引。
    
    
    */
    
    
    $arr = [];
    
    $arr = array_column($data,null,'id');
    //第二个参数设置为null,这样返回数组的键值为子数组的所有元素。
    //第三个参数设置为id,这样返回数组的键名为子数组中id索引的键值。
    
    
    echo '<pre>';
        print_r($arr);
    echo '<pre/>';
    
    
    
    /*
    
    输出数组
    
    Array
    (
        [5698] => Array
            (
                [id] => 5698
                [first_name] => Bill
                [last_name] => Gates
            )
    
        [4767] => Array
            (
                [id] => 4767
                [first_name] => Steve
                [last_name] => Jobs
            )
    
        [3809] => Array
            (
                [id] => 3809
                [first_name] => Mark
                [last_name] => Zuckerberg
            )
    
    )
    
    输出以ID为索引的二维数组成功。
    
    */
    
    
    
    
    

    顺便测试了一下这两个方法的效率。

    <?php
    
    $data = [];
    
    for($n = 0;$n<100000;$n++)
    {
        $data [] =  [
            'id' => md5(uniqid(mt_rand(), true)), //生成唯一id
            'first_name' => 'Mark',
            'last_name' => 'Zuckerberg',
        ];
    }
    
    
    
    
    $t1 = microtime(true);
    
    foreach( $data as $key => $value){
        $arr[$data[$key]['id']] = $value;
    }
    
    
    //$arr = array_column($data,null,'id');
    
    
    $t2 = microtime(true);
    
    echo $t2-$t1; 
    
    /*
    
    数组的元素个数在五千时,这两个方法的执行效率一样,
    但是数组元素个数在一万时,下面的方法效率比上面方法的效率快了一倍左右。
    
    */
    
    
    
    

     

    展开全文
  • 判断数组中是否包含某个值这里四种方法。用的测试数据: let arr=["a","b","c"]; let arr2={"a":"aaa","b":"bbb","c":"ccc"}; in判断是否在数组的key里in操作符针对的是key,而非value。而对于普通的维...

    判断数组中是否包含某个值这里有四种方法。
    用的测试数据:

    let arr=["a","b","c"];
    let arr2={"a":"aaa","b":"bbb","c":"ccc"};

    in判断是否在数组的key里
    in操作符针对的是key,而非value。而对于普通的一维数组来说,key是隐藏的。所以,对于判断某个数组中是否含有某个值来说,这个方案并不合适。

    console.log("1:","a" in arr);  // false
    console.log("2:","aa" in arr);  // false
    console.log("3:",2 in arr);  // true
    console.log("4:",5 in arr);  // false
    console.log("5:","a" in arr2);  // true
    console.log("6:","aa" in arr2);  // false

    indexOf列表(字符串)是否包含
    indexOf仅用于字符串、列表,不能用于JSON对象(字典)。

    console.log("7:",arr.indexOf("c"));  // 2
    console.log("8:",arr.indexOf("aa"));  // -1
    console.log("9:",arr2.indexOf("b"));  //报错
    console.log("10:",arr2.indexOf("aaa"));  //报错

    includes用于列表和字符串
    includes仅用于字符串、列表,不能用于JSON对象(字典)。
    返回值为布尔值。

    console.log("11:",arr.includes("a"));  // true
    console.log("12:",arr.includes("aa"));  // false
    console.log("13:",arr2.includes("a"));  //报错
    console.log("14:",arr2.includes("aa"));  //报错

    自定义函数inArray
    自定义函数inArray可以用于数组,也可以用于对象。

    function inArray(search,array){
        for(var i in array){
            if(array[i]==search){
                return true;
            }
        }
        return false;
    }
    console.log("15:",inArray("a",arr));
    console.log("16:",inArray("aa",arr));
    console.log("17:",inArray("a",arr2));
    console.log("18:",inArray("bbb",arr2)



    总结
    数组是否包含某个值的判断方案有:includes/indexOf/inArray。
    数组是否包含有个键的判断方案是:in。
    对象是否包含某个属性值的方案是:inArray。
    对象是否包含某个属性名的方案是:in。
    数组或者对象通用的判断方式包括:in/inArray。

    转载于:https://www.cnblogs.com/wjcoding/p/11505184.html

    展开全文
  • 前言怎样判断一个无序数组是否包含某个特定呢?这在JAVA是一个非常实用的操作,在Stack Overflow问答网站也同样是一个热门问题;要完成这个判断,可以通过若干种不同的方式来实现,每种实现方式对应的时间复杂...
  • 有趣的存在~forEach这方法,或者说数组存储的数据本身 看两例子: 例子:从例子来看forEach并不改变原数组 例子二:例子二里的obj的是被改变了的,那么forEach究竟改不改变原数组呢? 所以我们回到概念,...
  • php时候需要判断一个值是否存在于数组中,我们可以直接使用php内置函数in_array()来实现判断。php in_array 函数用于检查数组中是否存在某个值,如果存在,则返回true,否则返回false。本文章向大家介绍in_array...
  • js如何查找数组中是否存在某个值

    千次阅读 2019-10-30 14:05:22
    可以用数组的includes函数判断数组中是否存在某个值。 1、创建一个数组,为数组添加成员,然后将这个数组赋值给一个变量,这里以arr为例: 2、使用数组的includes函数,函数的参数为查找的值,如果数组中被...
  • php时候需要判断一个值是否存在于数组中...php in_array 函数用于检查数组中是否存在某个值,如果存在,则返回true,否则返回false。本文章向大家介绍in_array函数的基本语法及使用实例,感兴趣的朋友可以参考一下。
  • 怎样判断一个无序数组是否包含某个特定呢? 这在JAVA是一个非常实用的操作,在Stack Overflow问答网站也同样是一个热门问题; 要完成这个判断,可以通过若干种不同的方式来实现,每种实现方式对应的时间复杂读...
  • es6判断数组中是否有某个对象

    千次阅读 2019-12-27 10:05:25
    find() 方法返回数组中满足提供的测试函数的第一个元素的。否则返回 undefined。 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。 find方法: var objArr = [{id:1, name:'...
  • js 查找数组是否有某个值

    千次阅读 2019-06-14 15:54:38
    惯性思维是通过数组循环,一个个对比判断是否相等从而得出是否存在,一般需要一个flag变量来进行判断是否存在 像这样: var flag = false; var arr = ["a","b","c"]; for(var i = 0; i < arr.length; i++) { ...
  • java判断数组是否包含某个值相信大家在操作Java的时候,经常会要检查一个数组(无序)是否包含一个特定的值?这是一个在Java经常用到的并且非常有用的操作。下面给出四种方式,其中最有效率的还是loop方式,兴趣的...
  • 好几种方法 总结一下1:array.indexOf 此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1let arr = ['something', 'anything', 'nothing', 'anything'];let index = arr.indexOf('nothing'...
  • java判断数组是否包含某个值相信大家在操作Java的时候,经常会要检查一个数组(无序)是否包含一个特定的值?这是一个在Java经常用到的并且非常有用的操作。下面给出四种方式,其中最有效率的还是loop方式,兴趣的...
  • * 判断数组中是否包含某个值的方法 * //注:Java两种数据类型,基本数据类型和引用数据类型,判断基本数据类型是否相等用==,判断引用数据类型是否相等用equals */ public class ArrayQuery { public static ...
  • php check if array contains all array values from another array5个我有一个要与另一个数组匹配的数组,第一个数组内的所有都必须在第二个数组内,因此,如果第二个数组长度小于第一个数组...
  • JS-inArray检查数组中是否存在某个值 我们经常会用到这个一样逻辑,判断一个字符串或者数字是否在数组内,很多程序语言都这样一样专门的函数,比如PHP的in_array()。那么JS有木有呢,很遗憾,JS木...
  • 1:array.indexOf 此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1 let arr = ['something', 'anything', 'nothing', 'anything']; let index = arr.indexOf('nothing'); console.log...
  • 今天看了一下 好几种方法 总结一下1:array.indexOf 此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1let arr = ['something', 'anything', 'nothing', 'anything'];let index = arr....
  • 我们经常会用到这个一样逻辑,判断一个字符串或者数字是否数组内,很多程序语言都这样一样专门的函数,比如PHP的in_array()。那么JS有木有呢,很遗憾,JS木这样的函数,于是想到伟大的JQ是否封装了这个函数,...
  • 今天看了一下 好几种方法 总结一下1:array.indexOf 此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1let arr = ['something', 'anything', 'nothing', 'anything'];let index = arr....
  • 工作260:js判断一个数组是否包含一个指定的

    多人点赞 热门讨论 2020-12-25 20:31:01
    1:array.indexOf 此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1 let arr = ['something', 'anything', 'nothing', 'anything']; let index = arr.indexOf('nothing'); console.log...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 316
精华内容 126
关键字:

判断一个数组中是否有某个值