0

原点からの距離順に座標を出力するオブジェクトとクライアント クラスを作成しました。クライアントクラスは、ユーザーに、配列に必要な次元の数 (x、y または x、y、z)、生成するポイントの数、および各座標が実行される範囲 (例: -x から x) を尋ねます。 、-y から y など)。プログラムを実行すると、正しい数のポイントが出力されますが、配列には常に1つの余分な要素があります(ユーザーが配列の次元を「4」と入力すると、常に1つの余分な要素が出力されます-> [4、 5、9、6、1])。なぜこうなった?

クライアントクラス

    import java.io.*;   

public class MA {  

  public MA() { }   

  public static void main(String args[]) throws IOException { 

    String myString = "arrayNumPoints.txt";
    int numpoints = 0;
    int dimension = 0;
    double lengthscale = 0;
    double [][] points = new double[numpoints][dimension + 1]; 

    BufferedReader myInput = new BufferedReader(new InputStreamReader(System.in));

    MB pointsB = new MB(); 

    System.out.println("Enter number of points:"); 
    String numpointsA = myInput.readLine(); 
    numpoints = Integer.parseInt(numpointsA); 
    pointsB.setnumpoints(numpoints); 

    System.out.println("Enter the dimension:"); 
    String dimensionA = myInput.readLine(); 
    dimension = Integer.parseInt(dimensionA); 
    pointsB.setdim(dimension); 

    System.out.println("Enter length(range):"); 
    String lengthscaleA = myInput.readLine(); 
    lengthscale = Double.parseDouble(lengthscaleA); 
    pointsB.setlengthscale(lengthscale); 


    pointsB = new MB(numpoints, lengthscale, dimension, points);

    pointsB.fillarray(pointsB.getarray(), pointsB.getlengthscale(), pointsB.getdim(), pointsB.getnumpoints());
    pointsB.caldistance(pointsB.getarray(), pointsB.getnumpoints(), pointsB.getdim());
    pointsB.sort(pointsB.getarray(), 0, pointsB.getnumpoints()-1, pointsB.getdim());
    pointsB.writefile(pointsB.getarray(), pointsB.getnumpoints(), myString);
    pointsB.readfile(myString);
  }
}

オブジェクト クラス

    import java.io.*; 
import java.util.Arrays; 

public class MB { 

  //variables and arrays are declared
  private double lengthscale; 
  private int numpoints; 
  private int dimension; 
  private double [][] points; 

  //constructor
  public MB() { }   

  //constructor
  public MB(double [][] points) { 
    numpoints = 0; 
    lengthscale = 0; 
    dimension = 0; 
    points = new double[numpoints][dimension + 1]; 
  }   

  //constructor
  public MB(int mynumpoints, double mylengthscale, int mydimension, double [][] mypoints) { 
    numpoints = mynumpoints; 
    lengthscale = mylengthscale; 
    dimension = mydimension; 
    points = new double[numpoints][dimension + 1]; 
  }   

  //numpoints getter
  public int getnumpoints() 
  { 
    return numpoints; 
  }   

  //numpoints setter
  public void setnumpoints(int mynumpoints) { 
    numpoints = mynumpoints; 
  }   

  //lengthscale getter
  public double getlengthscale() { 
    return lengthscale; 
  }   

  //lengthscale setter
  public void setlengthscale(double mylengthscale) { 
    lengthscale = mylengthscale; 
  }   

  //dimension getter
  public int getdim() { 
    return dimension; 
  }  

  //dimension setter
  public void setdim(int mydimension) { 
    dimension = mydimension; 
  }   

  //array getter
  public double[][] getarray() { 
    return points; 
  }   

  //array setter
  public void setarray(double [][]mypoints, int numpoints, int dimension) { 
    points[numpoints][dimension] = mypoints[numpoints][dimension];
  }   

  //fill array method
  public void fillarray(double [][]mypoints, double mylengthscale, int mydimension, int mynumpoints) throws IOException { 

    for(int x = 0; x < mynumpoints; x++) 
    { 
      for(int y = 0; y < mydimension; y++) {
        //fills array with random points within the specified range
        mypoints[x][y] = (dimension * Math.random() - 1) * mylengthscale;   
      }//end for   
    }//end for
  }

  //writefile method
  public void writefile(double [][]mypoints, int mynumpoints, String myString) throws IOException { 

    //writes to myString
    PrintWriter fileOut = new PrintWriter(new FileWriter(myString));

    //for loop runs for length of mylengthscale
    for(int m = 0; m < mynumpoints; m++) {
      //prints points to file
      fileOut.println(Arrays.toString(mypoints[m]));   
    }
      //close file
      fileOut.close(); 
    //end for
  }

  //readfile metod
  public void readfile(String myString) throws IOException 
  { 
    String filePath = myString; 
    //reads data from mString
    BufferedReader in = new BufferedReader(new FileReader(new File(myString))); 
    String line = null; 

    while(( (line = in.readLine()) != null)) 

    System.out.println(line);   
    in.close(); 
  }  


  //caldistance method
  public void caldistance(double [][]mypoints, int mynumpoints, int mydimension) { 

    //for loop; calculates distance for specified number of points
    for(int i = 0; i < mynumpoints; i++) { 
      for(int k = 0; k < mydimension; k++) { 
        mypoints[i][mydimension] = mypoints[i][k] * mypoints[i][k];
      }//end for loop
      mypoints[i][mydimension] = Math.sqrt(mypoints[i][mydimension]); 
    }//end for loop                              
  }

  //sort method
  public double[][] sort(double[][] mynewpoints, int down, int top, int mydimension) {

    System.arraycopy(mynewpoints, 0, mynewpoints, 0, mynewpoints.length);

    //variables are declared
    int d = down;
    int u = top;

    //determines pivot point

    double [] pivot = mynewpoints[(down + top)/2];


    //sorts the values of the array, comparing it to the pivot
   do {
      while (mynewpoints[d][mydimension] < pivot[mydimension]) {
        d++;
      }

      while (mynewpoints[u][mydimension] > pivot[mydimension]) {
        u--;
      }

      if (d <= u) {
        double[] temporary = new double[mynewpoints[d].length];

        //compres values in array and switches them     
        for (int y = 0; y < mynewpoints[d].length; y++) {
          temporary[y] = mynewpoints[d][y];
          mynewpoints[d][y] = mynewpoints[u][y];
          mynewpoints[u][y] = temporary[y];
        }
        d++;
        u--;
      }
    } while (d <= u);

    if (down < u) {
      mynewpoints = sort(mynewpoints, mydimension, down, u);
    }

    if (d < top) {
      mynewpoints = sort(mynewpoints, mydimension, d, top);
    }

    return mynewpoints;

  }
}
4

2 に答える 2

0

おそらく1、ユーザーが指定したディメンションに追加しているためです。

points = new double[numpoints][dimension + 1];

これにより、配列は の値よりも 1 つ多くの列を持つことになりますdimension

于 2013-10-30T23:46:01.740 に答える
0

より具体的に説明する必要があります (使用しているコードと問題のあるコードの断片を示してください)。

ただし、MB コンストラクターで次のことを認識していますか。

  //constructor
  public MB(double [][] points) { 
    numpoints = 0; 
    lengthscale = 0; 
    dimension = 0; 
    points = new double[numpoints][dimension + 1]; 
  }  

最後の行は何もしていませんか?次のように記述する必要があります。

this.points = new double[numpoints][dimension + 1]; 

2 つの変数があるためpoints、1 つはクラス変数、2 つ目はパラメーターとして渡されます。これが発生した場合this、非クラス変数を使用せずに選択されます。

于 2013-10-30T23:42:49.713 に答える