怎么js 判断元素是否存在一个元素中是否还有元素

在Java中如何高效的判断数组中是否包含某个元素 - 推酷
在Java中如何高效的判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同的。本文将分析几种常见用法及其时间成本。
检查数组是否包含某个值的方法
public static boolean useList(String[] arr, String targetValue) {
return Arrays.asList(arr).contains(targetValue);
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))
Arrays.binarySearch()
Arrays.binarySearch()方法只能用于有序数组!!!如果数组无序的话得到的结果就会很奇怪。
查找有序数组中是否包含某个值的用法如下:
public static boolean useArraysBinarySearch(String[] arr, String targetValue) {
Arrays.binarySearch(arr, targetValue);
时间复杂度
下面的代码可以大概的得出各种方法的时间成本。基本思想就是从数组中查找某个值,数组的大小分别是5、1k、10k。这种方法得到的结果可能并不精确,但是是最简单清晰的方式。
public static void main(String[] args) {
String[] arr = new String[] {
&BC&, &EF&, &DE&, &AB&};
//use list
long startTime = System.nanoTime();
for (int i = 0; i & 100000; i++) {
useList(arr, &A&);
long endTime = System.nanoTime();
long duration = endTime - startT
System.out.println(&useList:
& + duration / 1000000);
startTime = System.nanoTime();
for (int i = 0; i & 100000; i++) {
useSet(arr, &A&);
endTime = System.nanoTime();
duration = endTime - startT
System.out.println(&useSet:
& + duration / 1000000);
//use loop
startTime = System.nanoTime();
for (int i = 0; i & 100000; i++) {
useLoop(arr, &A&);
endTime = System.nanoTime();
duration = endTime - startT
System.out.println(&useLoop:
& + duration / 1000000);
//use Arrays.binarySearch()
startTime = System.nanoTime();
for (int i = 0; i & 100000; i++) {
useArraysBinarySearch(arr, &A&);
endTime = System.nanoTime();
duration = endTime - startT
System.out.println(&useArrayBinary:
& + duration / 1000000);
运行结果:
useArraysBinarySearch:
使用一个长度为1k的数组
String[] arr = new String[1000];
Random s = new Random();
for(int i=0; i& 1000; i++){
arr[i] = String.valueOf(s.nextInt());
useArrayBinary:
使用一个长度为10k的数组
String[] arr = new String[10000];
Random s = new Random();
for(int i=0; i& 10000; i++){
arr[i] = String.valueOf(s.nextInt());
useArrayBinary:
显然,使用一个简单的循环方法比使用任何集合都更加高效。许多开发人员为了方便,都使用第一种方法,但是他的效率也相对较低。因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。
Arrays.binarySearch()
方法,数组必须是已排序的。由于上面的数组并没有进行排序,所以该方法不可使用。
实际上,如果你需要借助数组或者集合类高效地检查数组中是否包含特定值,一个已排序的列表或树可以做到时间复杂度为O(log(n)),hashset可以达到O(1)。
(英文原文结束,以下是译者注)
ArrayUtils
除了以上几种以外,Apache Commons类库中还提供了一个
ArrayUtils
类,可以使用其
方法判断数组和值的关系。
import mons.lang3.ArrayU
public static boolean useArrayUtils(String[] arr, String targetValue) {
return ArrayUtils.contains(arr,targetValue);
同样使用以上几种长度的数组进行测试,得出的结果是该方法的效率介于使用集合和使用循环判断之间(有的时候结果甚至比使用循环要理想)。
useArrayBinary:
useArrayUtils:
useArrayBinary:
useArrayUtils:
其实,如果查看
ArrayUtils.contains
的源码可以发现,他判断一个元素是否包含在数组中其实也是使用循环判断的方式。
部分代码如下:
if(array == null) {
return -1;
if(startIndex & 0) {
startIndex = 0;
if(objectToFind == null) {
for(i = startI i & array. ++i) {
if(array[i] == null) {
} else if(array.getClass().getComponentType().isInstance(objectToFind)) {
for(i = startI i & array. ++i) {
if(objectToFind.equals(array[i])) {
return -1;
所以,相比较之下,我更倾向于使用ArrayUtils工具类来进行一些合数祖相关的操作。毕竟他可以让我少写很多代码(因为自己写代码难免有Bug,毕竟apache提供的开源工具类库都是经过无数开发者考验过的),而且,效率上也并不低太多。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致& & 一、判断文本是否为空& & 复制代码代码如下:& & var jqObj = $(this);& & if(jqObj.text().trim()){ //trim()方法是去空格,$.trim()函数删除提供字符串的所有换行符,空格(包括非中断空格),开始和结束tab。如果这些……
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程如何判断一个元素是否在可视区域内
在制作移动端的页面时,当页面上有视频并且正在播放时,如何让视频在消失的时候停止播放,之后便针对这个问题进行解决。
首先,我们先了解一下几个概念,先假设该元素为$(&#main&)
1.元素距离页面顶部的距离
& &var mainOffsetTop = $(&#main&).offset().
2.元素的高度
& &var mainHeight = $(&#main&).height();
3.页面滚动的距离
&&var windowScrollTop = $(window).scrollTop();
4.浏览器可见区域的高度
& &var windowHeight = $(window).height();
下面我们就来看一下如何判断该元素是否在可视区域内呢?在窗口上下滚动的情况下, 一个页面元素的状态有下面3种:
& & 1.向上滚动超出可见区域
& & 2.向下滚动超出可视区域
& & 3.在可视区域内
& & 第一种情况& &由于元素随页面向上滚动, 整个页面滚动的距离&&大于 (元素距离页面顶部的距离 + 元素本身的高度 )-& 超出
& & 第二种情况& &由于元素随页面向下滚动, 整个页面滚动的距离&&小于 (元素距离页面顶部的距离 - 浏览器可见区域高度 )-& 超出
& & 如下图所示:
& & 代码如下所示:
& & html 代码效果预览&!DOCTYPE html&
&head lang=&en&&
&meta charset=&UTF-8&&
&meta http-equiv=&X-UA-Compatible& content=&IE=edge,chrome=1&&
&meta name=&renderer& content=&webkit&&
&meta name=&viewport& content=&width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no&&
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8&&
&meta name=&robots& content=&all&&
&meta name=&format-detection& content=&telephone=no& /&
&title&如何判断一个元素是否在可是区域内&/title&
height: 4000
height: 1800
height: 200
border: 1px solid #000;
line-height: 200
text-align:
&script src=&/jquery-1.8.0.min.js&&&/script&
$(function(){
var mainOffsetTop = $(&#main&).offset().
var mainHeight = $(&#main&).height();
var winHeight = $(window).height();
$(window).scroll(function(){
var winScrollTop = $(window).scrollTop();
if(winScrollTop & mainOffsetTop + mainHeight || winScrollTop & mainOffsetTop - winHeight){
alert(&不在可是区域内&);
alert(&在可是区域内&);
&h1&1&/h1&
&p id=&main&&我是该元素&/p&
&h1&2&/h1&
你这字,很适合当程序员
谢谢,马上修改 //:可视区域&&not 可是
可视区域&&not 可是
128 总笔记数
10.3万 总阅读量
Copyright &
All Rights Reserved.
合作伙伴:后使用快捷导航没有帐号?
查看: 7269|回复: 3
各位高手:& && &&&如题,例如,有一个很大的数组,其中的元素大概可以达到上千个吧。而这时我想查看一个元素是不是存在于这个数组中如何实现?& && &&&实际的问题是这样的,我拿到了一份很大的 verilog文件。其中有很多的module.现在由于某种原因想把verilog中的每一个module加一个前缀名。因为verilog中module定义后,是要被调用的。把module名加了前缀后,调用的部分也要加。所以,我想第一次遍历文件的时候把module名放进一个数组。再查看调用的相关行,例化名如果存在于module所存在的数组中就要加一个前缀,以便与改过的module对应起来。但是我实际这么做的时候发现,这人脚本运行起来很慢,主要原因是确定例化名在不在数组的循环太费时。& && &&&所以,我想问一问,有没有什么方法可以很快的确定数组中包含不包含某一元素。 注,不要用5.10以后的方法。要用5.10以前的方法,如果能提供一个模块来实现就更好了。谢谢了。
建议用hash数组,用if(exist $hash{$key}){...}
ly5132 发表于
建议用hash数组,用if(exist $hash{$key}){...}
非常感谢,我试过了,速度果然快了不止100倍.
应该是exists
Powered by Discuz!
& Comsenz Inc.}

我要回帖

更多关于 js 判断元素是否存在 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信