避免在java中嵌套foreach循环
我上编码课已经20年了。为了好玩,我不时地把它捡起来,但我的代码很笨重,效率很低 我有一个包含400多个元素的数组。我目前有嵌套的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
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