コーディングクラスを取ってから約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");
}
}
これはうまくコンパイルされますが、非常に遅く実行されます。
これを行うより効率的な方法はありますか?
おそらくネストの周りを取得する方法 - の効果に何か:(:DMC色i、j、k)は、
ため
?
あなたの期待は何ですか?あなたのコードで何をしようとしていますか? –
あなたのユースケースによっては、それはすぐに本当に実行できるように、このコードは、並列化かもしれませんが、あなたが達成したいものについての詳細を教えする必要があります。 –
あなたは最初にあなたの配列をArrayListに変換する、2:最初の2つの項目が等しいかどうかをチェックすることで、速度を1で得ることができます。 (あなたのコードに基づいて彼らがなぜ迷惑を掛けないかをチェックしてください)、あなたは何ミリ秒も節約することができます。 :) – Elltz