自從我編寫了一個編碼類已經有20年了。我不時重新撿起它來獲得樂趣,但是我的代碼是低效率的笨重的&。避免在java中嵌套foreach循環
我有一個超過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");
}
}
這個編譯得很好,但真的很慢。
有沒有更有效的方法來做到這一點?
可能的方式來解決嵌套 - 東西的效果:
的(顏色I,J,K:DMC)
?
你的期望是什麼?你想用你的代碼做什麼? –
根據您的使用情況,此代碼可能是可並行化的,因此它可以很快運行,但您需要告訴我們更多關於您想實現的內容。 –
你可以通過1得到一些速度:最初將你的數組轉換爲一個ArrayList,2:檢查前兩項是否相等。 (根據你的代碼,如果他們不檢查爲什麼打擾),你可以節省一些毫秒。 :) – Elltz