0 0

两层for循环判断,如何优化5


List<String> myRoles = new ArrayList<String>();
List<String> hasRoles = new ArrayList<String>();

public boolean hasRole()
{
    for (String my : myRoles)
    {
	for (String role : hasRoles)
        {
		if(my.equals(role))
		{
			return true;
		}
	}
    }
    
    return false;
}


上面方面的逻辑是:myRoles集合中的字符串,只要有一个在hasRoles集合中存在,就返回true
但是,这个方法嵌套了2层for循环,效率似乎很低

求改进的方法
 
2014年6月19日 15:33

12个答案 按时间排序 按投票排序

0 0

采纳的答案

用Set做一个myRoles和hasRoles的并集,然后判断这个并集的大小是不是等于myRoles和hasRoles的大小相加,如果不是的话,可定有重复了。

Set<String> totalRoles = new HashSet<String>();
List<String> myRoles = new ArrayList<String>();  
List<String> hasRoles = new ArrayList<String>();  
  
public boolean hasRole()  
{  
    // you can use addAll()
    for (String my : myRoles)  
    {  
      totalRoles.add(my);
    }
    // you can use addAll()
    for (String role : hasRoles)  
      totalRoles.add(role);     
    }  
    return totalRoles.size()==(myRoles.size()+hasRoles.size());
} 


查看下ArrayList.retainAll 和removeAll本质上都做了两个for循环

2014年6月19日 21:12
0 0

其实这个不就是求是否有交集吗?

public boolean hasRole(){
List<String> myRoles = new ArrayList<String>();
		List<String> hasRoles = new ArrayList<String>();
		hasRoles.retainAll(myRoles);
		return hasRoles.size() > 0;
}
这样不用循环就行了

2014年6月23日 10:56
0 0

说实话,这个最佳答案不敢恭维。
还是第二个答案最靠谱。
你的最佳答案必须循环M+N次
但是第二个答案最坏情况下是M+N,而且没有任何问题,不管List数据是否重复
但是你的最佳答案就不行了。

2014年6月22日 19:57
0 0

List<String> myRoles = new ArrayList<String>();  
		List<String> hasRoles = new ArrayList<String>();  
		String hasRolesList = Arrays.deepToString(hasRoles.toArray());
		
		public boolean hasRole()  
		{  
		    for (String my : myRoles)  
		    {  
		    	if (hasRolesList.indexOf(my) > 0)
		    	{
		    		 return true;
		    	}
		    }  
		      
		    return false;  
		}  

2014年6月20日 10:08
0 0

为什么要用双层循环?楼下的想到的办法不敢恭维,首先想到的应该是API的list的contains方法把
for (String my : myRoles){
   if(hasRoles.contains(my)){
      return true;
   }
}
return false;

2014年6月20日 10:00
0 0

如果你仅仅想要判断两个list中是否含有相同的元素,那么我觉得可以用
你先将两个list合并成一个list,然后将合并后的list放入hashset中
HashSet h  =   new  HashSet(list);
然后输入h.size(),如果他的size和你的两个list的size相同,说明没有重复的,否则有重复的
因为hashset的作用就是去重,他不允许相同的元素存在,只会保留一个

2014年6月20日 08:32
0 0

Map<String, Integer> hasRolesMap = new HashMap<String, Integer>();
for(String role : hasRoles) {
	hasRolesMap.put(role, 1);
}

for(String my : myRoles) {
	if(hasRolesMap.get(my) != null) {
		return true;
	}
}

2014年6月19日 23:17
0 0

用Set做一个myRoles和hasRoles的并集,然后判断这个并集的大小是不是等于myRoles和hasRoles的大小相加,如果不是的话,可定有重复了。

Set<String> totalRoles = new HashSet<String>();
List<String> myRoles = new ArrayList<String>();  
List<String> hasRoles = new ArrayList<String>();  
  
public boolean hasRole()  
{  
    // you can use addAll()
    for (String my : myRoles)  
    {  
      totalRoles.add(my);
    }
    // you can use addAll()
    for (String role : hasRoles)  
      totalRoles.add(role);     
    }  
    return totalRoles.size()==(myRoles.size()+hasRoles.size());
} 


查看下ArrayList.retainAll 和removeAll本质上都做了两个for循环

2014年6月19日 21:11
0 0

个人认为这个不需要优化了。即使优化了,带来的性能提升也不大。把优化的关注点放在其他点吧

2014年6月19日 19:11
0 0

List<String> myRoles = new ArrayList<String>();  
    myRoles.add("1");
    myRoles.add("2");
    myRoles.add("3");
    myRoles.add("4");

    List<String> hasRoles = new ArrayList<String>(); 
    hasRoles.add("2");
    hasRoles.add("3");
    myRoles.removeAll(hasRoles);

    System.out.println(myRoles.size());
结果为:myRoles.size :2
看你的代码好像是要比较2个集合中只要有一个元素同时存在就返回true
你可以试试removeAll方法,如果此方法后他的size有变化,说明有元素共同存在
也能达到你要的效果。你试试效率会不会比双重for要好,只是提供个想法,没试过效率

2014年6月19日 17:26
0 0

只是需要判断是否重复还有一个方法,使用一个临时map
List<String> myRoles = new ArrayList<String>();
List<String> hasRoles = new ArrayList<String>();

public boolean hasRole(){
Map<String,String> map = new HashMap();
//这个尽量选用数据量小的list
for (String my : myRoles){
map.put(my, "1");
}
int mysize = myRoles.size();
for (String role : hasRoles){
map.put(role, "1");
//重复时mysize == map.size();
if (map.size() == mysize){
return true;
}
}    
    return false;
}

2014年6月19日 16:18
0 0

1. java8中新特性中有Lambda表达式,类似SQL语句可以简化
2. 写类似于二分法查找的算法。String.HasCode
3. 没想到呢!!!

2014年6月19日 16:08

相关推荐

    for 循环练习题目

    1. 使用两层嵌套 `for` 循环遍历所有可能的四位数。 2. 检查每个数是否满足条件。 3. 如果满足条件,则打印出来。 ```python for i in range(1, 10): # 第一位不能为0 for j in range(0, 10): num = int(str(i) *...

    For循环(Pascal)

    例如,两层`for`循环可以用于遍历二维数组,每一层`for`循环控制一个维度。 五、Cena评测包与源程序 提供的"Cena评测包+源程序"可能是用于检验和练习`for`循环的实例。通过运行这些源代码,你可以看到`for`循环在...

    Objective-C for循环变形

    本文将深入探讨`for`循环的变形,特别是`嵌套for循环`,并结合实际示例来理解其工作原理。 嵌套的`for`循环是指在一个`for`循环体内部再包含另一个`for`循环。这种结构在处理二维数组、矩阵计算、遍历多级目录或...

    For循环嵌套要点和难点具体案例

    1. **多维数组**:在处理二维数组时,常常需要通过两层for循环遍历每个元素。外层循环遍历行,内层循环遍历列。 2. **网格计算**:如求解棋盘上的所有可能路径、计算像素图像等,可以用嵌套for循环来生成坐标网格。 ...

    C#循环案例

    这个示例代码使用了两个for循环,外层循环控制行数,内层循环控制列数。通过这种嵌套循环,可以生成九九乘法表的输出结果。 二、土字图案 下面是一个使用for循环生成土字图案的示例代码: ```csharp for (int i = 0...

    java使用for循环语句在控制台上输出九九乘法表_的各种变换形式

    这段代码使用了两层 for 循环语句,外层循环用于控制行数,内层循环用于控制列数。在内层循环中,使用 System.out.print() 方法输出乘法表的每一项,然后使用 System.out.printf() 方法输出结果。最后,使用 System....

    python 入门(1)if-for循环之冒泡排序

    在Python编程语言中,控制流程是程序执行的关键部分,其中包括条件语句(如if语句)和循环结构(如for循环)。本节我们将深入探讨如何使用这些基础概念来实现冒泡排序,这是一个简单的排序算法,适合初学者学习。 ...

    JavaScript for循环 if判断语句(学习笔记)

    在JavaScript编程语言中,`for`循环和`if`判断语句是两种基本的控制流程结构,它们在编写逻辑和处理条件时起着至关重要的作用。让我们深入了解一下这两个概念。 **1. JavaScript `for`循环** `for`循环用于重复执行...

    Java基础之for循环嵌套.docx

    ### Java基础之for循环嵌套 #### 概念与特点 在Java编程语言中,循环结构是实现重复操作的关键组成部分之一。嵌套循环是指在一个循环内部包含另一个完整的循环体,通常用于处理多维数据结构(如二维数组)或在解决...

    巧用for循环绘制各种图形

    九九乘法表的绘制则需要用到两层for循环,外层循环遍历1到9,内层循环遍历1到当前外层循环变量`i`。每次迭代时,内层循环都会打印乘法表达式及其结果,每个表达式之间用制表符分隔,然后换行。这样,当内外层循环都...

    微信小程序中页面FOR循环和嵌套循环

    在微信小程序开发中,页面的渲染常常涉及到数据的遍历,这时就用到了循环,特别是FOR循环和嵌套循环。本文将深入探讨这两种循环结构在微信小程序中的使用方法及其注意事项。 1. 单个循环(FOR循环) 微信小程序中...

    JS数组的遍历方式for循环与for...in

    在本节中,我们将详细探讨两种常用的数组遍历方法:传统的for循环和for...in循环。 首先,传统的for循环是最常用的数组遍历方式之一。它按照指定的起始条件、结束条件以及迭代步长来遍历数组。在JavaScript中,for...

    Python利用for循环打印星号三角形的案例

    这个简洁的版本只用一层for循环实现,每次循环打印i+1个星号,随着i的增加,星号的数量逐渐增多,形成一个实心三角形。 3. 实心正方形: ```python for i in range(5): print("* "*5) ``` 同样只用一层for...

    黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构

    #### 二、for循环详解 **2.1 for循环格式** `for`循环是一种常用的循环结构,其基本格式如下: ```java for(初始化表达式; 循环条件表达式; 循环后的操作表达式) { // 循环体 } ``` 其中,初始化表达式在循环...

    asp.net中for和do循环语句用法分享

    示例中使用了两层嵌套的for循环,外层循环控制虚部(imagCoord),内层循环控制实部(realCoord)。通过这两个循环,可以在复平面上对每个点进行迭代,根据迭代次数判断该点的颜色,从而绘制出Mandelbrot图像。 在...

    vb程序设计for循环练习[文].pdf

    ### VB程序设计FOR循环知识点详解 #### 一、FOR/NEXT循环基础知识 1. **终止FOR/NEXT循环的条件** FOR/NEXT循环的基本结构是`FOR 变量 = 初始值 TO 终止值 [STEP 步长]`,其中循环的终止条件是循环变量是否超过...

    【C语言】for循环嵌套-等式推导(csdn)————程序.pdf

    外层的for循环从1到9依次遍历S,然后是I、X、N,最内层的循环遍历E。在每次循环中,都会检查当前的SIX是否满足3倍等于NINE的两倍的条件,如果满足,则计数器`cnt`加1。不满足条件则继续下一个循环。 代码中的条件...

    Java实验报告——循环结构应用

    接着,通过两层嵌套的for循环遍历所有可能的购买组合。外层循环控制仙女草的购买数量,内层循环控制银河梭的购买数量。在循环中,使用if语句检查当前组合是否满足金币不超过剩余数量并且生命力增加超过之前的最大值...

    oracle plsql for loop循环 求素数

    - **外部FOR循环**:遍历100到200的每一个数字。 - **内部FOR循环**:对每个数字进行素数检测。 - **MOD函数**:与`LOOP`循环中的用法相同。 #### WHILE 循环 `WHILE`循环则是在满足特定条件时重复执行一段代码块...

    java循环嵌套

    这个过程可以通过两层嵌套的for循环实现。 2. **"Test2.java"**:因子对的打印则需要一层循环来遍历输入数字n的所有可能因子,然后在内部用另一个循环来寻找每个因子的配对。例如,外部循环遍历1到n的所有整数,...

Global site tag (gtag.js) - Google Analytics