以下のコードは、配列のローカル最大値を正しく検出しますが、ローカル最小値を見つけることができません。私はミニマを見つけるための最良の方法を見つけるためにウェブ検索をしました、そして、私はそれらの検索に基づいて、以下の正しい方法を使用していると思います。しかし、下のコードには、数日かけて何度も各行に何度も行った後、まだ見ていないバグがあります。ローカル検索最小値
変数startXとendXは、コードがローカル最小値/最大値を見つけなければならないユーザー選択ウィンドウを定義します。 startXとendXの値を操作すると、下のコードは常に、選択したウィンドウの最初のインデックスとして最小値を出力します。これは、最小値を検索するためにウィンドウ内のインデックスを反復していないことを示します。
誰でもこのバグを見つけて、以下のコードを修正してローカルの最小値を見つける方法を教えてください。
class LocalMinMax {
static double[] pts;
static int visiblePoints=5000;
static int startX = 200;
static int endX = 700;
public static void main (String[] args) {
int lastX2 = 0;
int maxWidth = 800;
double hstep = (double) maxWidth/visiblePoints;
int maxHeight = 400;
pts = new double[visiblePoints];
double max = Double.NEGATIVE_INFINITY;
double min = Double.POSITIVE_INFINITY;
int minIndex = -1;
int maxIndex = -1;
for (int i = 0; i < visiblePoints; i++){
pts[i] = (double) ((((Math.sin(.009*i))*(Math.cos(.004*i))) * (maxHeight/3) * .95) + (maxHeight/2));
int x2 = (int) (i * hstep);
if(x2>=startX){
int sectionStartIndex = i;
int sectionEndIndex = (int)(endX/hstep);
for(int k=sectionStartIndex;k<sectionEndIndex;k++){
if(min>pts[k]){
min = pts[k];
minIndex = x2;
System.out.println("minIndex, min, pts["+k+"]: , x2 are: "+minIndex+", "+min+", "+pts[k]+", "+x2);
}
if(max<pts[k]){
max = pts[k];
maxIndex = x2;
}}}
if(lastX2!=x2){
lastX2=x2;
if(x2==startX){
int width = endX - startX;
System.out.println("WINDOW: width, startX, endX are: "+width+", "+startX+", "+endX);
}}}
int maxVal = (int)max;
int minVal = (int)min;
System.out.println("LOCAL MAX: maxIndex, maxVal are: "+maxIndex+", "+maxVal);
System.out.println("LOCAL MIN: minIndex, minVal are: "+minIndex+", "+minVal);
}}
これはdo-my-homeworkの質問のように聞こえます。あなたはグーグルの「javaの配列の最大要素を見つける」と考えましたか?あなたは素晴らしい結果を得るでしょう。 – chahuistle
@chahuistle、キーワード候補をありがとう。はい、私は最大/分をjavaで見つける方法を知っています。そして、はい、私はウェブ検索を行っています。混乱は、paintComponent()コードとの統合に関するものです。私のコードを見ると、min/maxを見つけるための正しい方法を使用し、グローバルmin/maxが正しく検出されることがわかります。また、私のコードのローカルminを見つけるために働かないメソッドの1つは、Web検索で見つかったメソッドから直接得られます。しかし、はい、私はまたあなたが提案したキーワードからの検索結果を見るでしょう。ありがとうございました。 – CodeMed
問題は、 'double min = Double.POSITIVE_INFINITY'を評価した直後に、' if(min> pts [k]) '行が最初の反復でminをゼロに設定しているということです。この関数のすべての値は正の値なので、 'if(min> pts [k])'は決して真と評価されないので、ウィンドウの開始インデックスのパネルの最上部に最小矩形マーカーが残ります。最初のパスでゼロになるのを止めることができれば、このバグを取り除くことができます。何か案は? – CodeMed