避免在java中嵌套foreach循环

避免在java中嵌套foreach循环,java,foreach,nested,processing-efficiency,Java,Foreach,Nested,Processing Efficiency,我上编码课已经20年了。为了好玩,我不时地把它捡起来,但我的代码很笨重,效率很低 我有一个包含400多个元素的数组。我目前有嵌套的foreach循环在该数组上运行 import acm.program.ConsoleProgram; import java.awt.Color; import acm.io.IODialog; import java.text.*; import static java.lang.Math.*; import java.util.*; /** Tests to

我上编码课已经20年了。为了好玩,我不时地把它捡起来,但我的代码很笨重,效率很低

我有一个包含400多个元素的数组。我目前有嵌套的foreach循环在该数组上运行

import acm.program.ConsoleProgram;
import java.awt.Color;
import acm.io.IODialog;
import java.text.*;
import static java.lang.Math.*;
import java.util.*;

/** Tests to see if user color matches sample colors */

public class test extends ConsoleProgram

{

   //defining sample colors

   Color[] dmc =
   {
      new Color(255,255,255),
      new Color(148,91,128),
      new Color(206,148,186),
      new Color(236,207,225),
      new Color(243,218,228),

   };

 public void run()
 {
    average();

 }

 //averages three colors, then tests for match to given color

 public void average()
 {

    //asks for user color
    IODialog dialog = new IODialog();
    int stitchRed= dialog.readInt("Enter red value: ");
    int stitchGreen= dialog.readInt("Enter green value: ");
    int stitchBlue= dialog.readInt("Enter blue value: ");
    Color stitchColor= new Color(stitchRed,stitchGreen,stitchBlue);

    //gets averages for dmc colors
    for (Color i:dmc)
    {
       for (Color j:dmc)
       {
          for (Color k:dmc)
          {
              int indexI = Arrays.asList(dmc).indexOf(i);
              int indexJ = Arrays.asList(dmc).indexOf(j);
              int indexK = Arrays.asList(dmc).indexOf(k);
              if(indexI <= indexJ && indexJ <= indexK)
              {
                 int iRed = i.getRed();
                 int jRed = j.getRed();
                 int kRed = k.getRed();
                 int iGreen = i.getGreen();
                 int jGreen = j.getGreen();
                 int kGreen = k.getGreen();
                 int iBlue = i.getBlue();
                 int jBlue = j.getBlue();
                 int kBlue = k.getBlue();
                 int redAverage = (iRed+jRed+kRed)/3;
                 int greenAverage = (iGreen+jGreen+kGreen)/3;
                 int blueAverage = (iBlue+jBlue+kBlue)/3;
                 Color colorAverage = new Color(redAverage,greenAverage,blueAverage);

                 //tests to see if any thread average equals user color
                 if (colorAverage.equals(stitchColor))
                 {
                    println("The color match is: " + i + ", " + j + ", " + k);
                 }
            }
         }
       }
     }

     println("no more matches");
   }
 }
导入acm.program.ConsoleProgram;
导入java.awt.Color;
进口acm.io.IODialog;
导入java.text.*;
导入静态java.lang.Math.*;
导入java.util.*;
/**测试用户颜色是否与示例颜色匹配*/
公共类测试扩展了控制台程序
{
//定义示例颜色
颜色[]dmc=
{
新颜色(255255),
新颜色(14891128),
新颜色(206148186),
新颜色(236207225),
新颜色(243218228),
};
公开募捐
{
平均值();
}
//平均三种颜色,然后测试与给定颜色的匹配
公共空隙平均值()
{
//询问用户颜色
Iiodialog=新建Iiodialog();
int-stitchRed=dialog.readInt(“输入红色值:”);
int-stitchGreen=dialog.readInt(“输入绿色值:”);
int-stitchBlue=dialog.readInt(“输入蓝色值:”);
颜色缝合颜色=新颜色(缝合、缝合绿色、缝合蓝色);
//获取dmc颜色的平均值
用于(颜色i:dmc)
{
用于(颜色j:dmc)
{
用于(颜色k:dmc)
{
int indexI=Arrays.asList(dmc).indexOf(i);
int indexJ=Arrays.asList(dmc).indexOf(j);
int indexK=Arrays.asList(dmc).indexOf(k);

如果(indexI考虑到您在if语句中过滤掉了许多组合,一种优化方法是只用于迭代您实际要处理的元素的循环,而不是用于每个循环。例如,i考虑到您在if语句中过滤掉了许多组合,一种优化方法是只用于迭代t的循环他是您实际想要处理的元素,而不是每个循环。例如,i您可以尝试以下方法

for( x=1;x<401;x++ )
{
    Color j= dmc[x];
    Color k= dmc[x+1];
    int indexI = Arrays.asList(dmc).indexOf(i);
    int indexJ = Arrays.asList(dmc).indexOf(j);
    int indexK = Arrays.asList(dmc).indexOf(k);
    if( indexI <= indexJ && indexJ <= indexK )
    {
        //bunch of code...

对于(x=1;x您可以尝试以下方法

for( x=1;x<401;x++ )
{
    Color j= dmc[x];
    Color k= dmc[x+1];
    int indexI = Arrays.asList(dmc).indexOf(i);
    int indexJ = Arrays.asList(dmc).indexOf(j);
    int indexK = Arrays.asList(dmc).indexOf(k);
    if( indexI <= indexJ && indexJ <= indexK )
    {
        //bunch of code...
for(x=1;x(我无法测试和调试代码,因为它不是一个,所以我对任何错误都表示抱歉)

考虑以下内容,详情请参见评论:

Color[ ] dmc = {element1, element2, ...};

for( int i =0; i < dmc.length ; i++ )
 {
    
    //iterate only on values >= i 
   for( int j = i; j< dmc.length; j++ )
   {
       //loop only on values >= j
       for( int k = j; k < dmc.length ; k++ )
       {
        
           //not needed, you already have i, j, k 
           //int indexI = Arrays.asList(dmc).indexOf(i);
           //int indexJ = Arrays.asList(dmc).indexOf(j);
           //int indexK = Arrays.asList(dmc).indexOf(k);
          
           
           //condition is not needed. Allways true. 
           //if( indexI <= indexJ && indexJ <= indexK ) { }
           
           //bunch of code...
在本测试用例中,两种方法之间的运行时差异非常显著:

everage()的运行时间(纳秒)84752814

fastEverage()的运行时间(以纳秒为单位)76497255

(我无法测试和调试代码,因为它不是一个,所以我对任何错误都表示抱歉)
考虑以下内容,详情请参见评论:

Color[ ] dmc = {element1, element2, ...};

for( int i =0; i < dmc.length ; i++ )
 {
    
    //iterate only on values >= i 
   for( int j = i; j< dmc.length; j++ )
   {
       //loop only on values >= j
       for( int k = j; k < dmc.length ; k++ )
       {
        
           //not needed, you already have i, j, k 
           //int indexI = Arrays.asList(dmc).indexOf(i);
           //int indexJ = Arrays.asList(dmc).indexOf(j);
           //int indexK = Arrays.asList(dmc).indexOf(k);
          
           
           //condition is not needed. Allways true. 
           //if( indexI <= indexJ && indexJ <= indexK ) { }
           
           //bunch of code...
在本测试用例中,两种方法之间的运行时差异非常显著:

everage()的运行时间(纳秒)84752814

fastEverage()的运行时间(以纳秒为单位)76497255


它等于@C0der的答案,只是对问题的var使用了相同的名称

    for (int indexI = 0; indexI < dmc.length; indexI++) {
        Color i = dmc[indexI];
        for (int indexJ = indexI; indexJ< dmc.length; indexJ++) {
            Color j = dmc[indexJ];
            for (int indexK = indexJ; indexK< dmc.length; indexK++) {
                Color k = dmc[indexK];
                //....
            }
        }
    }
for(int indexI=0;indexI
编辑:

public void average() {
    //asks for user color
    IODialog dialog = new IODialog();
    int stitchRed = dialog.readInt("Enter red value: ");
    int stitchGreen = dialog.readInt("Enter green value: ");
    int stitchBlue = dialog.readInt("Enter blue value: ");
    Color stitchColor = new Color(stitchRed, stitchGreen, stitchBlue);
    for (int indexI = 0; indexI < dmc.length; indexI++) {
        Color i = dmc[indexI];
        for (int indexJ = indexI; indexJ < dmc.length; indexJ++) {
            Color j = dmc[indexJ];
            for (int indexK = indexJ; indexK < dmc.length; indexK++) {
                Color k = dmc[indexK];
                int iRed = i.getRed();
                int jRed = j.getRed();
                int kRed = k.getRed();
                int iGreen = i.getGreen();
                int jGreen = j.getGreen();
                int kGreen = k.getGreen();
                int iBlue = i.getBlue();
                int jBlue = j.getBlue();
                int kBlue = k.getBlue();
                int redAverage = (iRed + jRed + kRed) / 3;
                int greenAverage = (iGreen + jGreen + kGreen) / 3;
                int blueAverage = (iBlue + jBlue + kBlue) / 3;
                Color colorAverage = new Color(redAverage, greenAverage, blueAverage);
                //tests to see if any thread average equals user color
                if (colorAverage.equals(stitchColor)) {
                    System.out.println("The color match is: " + i + ", " + j + ", " + k);
                }
            }
        }
    }

    System.out.println("no more matches");
}
public void average(){
//询问用户颜色
Iiodialog=新建Iiodialog();
int-stitchRed=dialog.readInt(“输入红色值:”);
int-stitchGreen=dialog.readInt(“输入绿色值:”);
int-stitchBlue=dialog.readInt(“输入蓝色值:”);
颜色缝合颜色=新颜色(缝合、缝合绿色、缝合蓝色);
for(int indexI=0;indexI
它等于@C0der的答案,只是对问题的变量使用了相同的名称

    for (int indexI = 0; indexI < dmc.length; indexI++) {
        Color i = dmc[indexI];
        for (int indexJ = indexI; indexJ< dmc.length; indexJ++) {
            Color j = dmc[indexJ];
            for (int indexK = indexJ; indexK< dmc.length; indexK++) {
                Color k = dmc[indexK];
                //....
            }
        }
    }
for(int indexI=0;indexI
编辑:

public void average() {
    //asks for user color
    IODialog dialog = new IODialog();
    int stitchRed = dialog.readInt("Enter red value: ");
    int stitchGreen = dialog.readInt("Enter green value: ");
    int stitchBlue = dialog.readInt("Enter blue value: ");
    Color stitchColor = new Color(stitchRed, stitchGreen, stitchBlue);
    for (int indexI = 0; indexI < dmc.length; indexI++) {
        Color i = dmc[indexI];
        for (int indexJ = indexI; indexJ < dmc.length; indexJ++) {
            Color j = dmc[indexJ];
            for (int indexK = indexJ; indexK < dmc.length; indexK++) {
                Color k = dmc[indexK];
                int iRed = i.getRed();
                int jRed = j.getRed();
                int kRed = k.getRed();
                int iGreen = i.getGreen();
                int jGreen = j.getGreen();
                int kGreen = k.getGreen();
                int iBlue = i.getBlue();
                int jBlue = j.getBlue();
                int kBlue = k.getBlue();
                int redAverage = (iRed + jRed + kRed) / 3;
                int greenAverage = (iGreen + jGreen + kGreen) / 3;
                int blueAverage = (iBlue + jBlue + kBlue) / 3;
                Color colorAverage = new Color(redAverage, greenAverage, blueAverage);
                //tests to see if any thread average equals user color
                if (colorAverage.equals(stitchColor)) {
                    System.out.println("The color match is: " + i + ", " + j + ", " + k);
                }
            }
        }
    }

    System.out.println("no more matches");
}
public void average(){
//询问用户颜色
Iiodialog=新建Iiodialog();
int-stitchRed=dialog.readInt(“输入红色值:”);
int-stitchGreen=dialog.readInt(“输入绿色值:”);
int-stitchBlue=dialog.readInt(“输入蓝色值:”);
颜色缝合颜色=新颜色(缝合、缝合绿色、缝合蓝色);
for(int indexI=0;indexI