0

我创建了一个对象和客户端类,它按照与原点的距离顺序打印坐标。客户端类询问用户他们希望数组有多少维度(x,y 或 x,y,z)他们想要生成多少个点,以及每个坐标的运行范围(例如 -x 到 x , -y 到 y 等)。当我运行程序时,它会打印出正确的点数,但数组中总会有一个额外的元素(等等。当用户输入数组的维度为“4”时,它总是会打印出一个额外的元素 -> [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

您应该更具体(向我们展示您使用的代码片段以及出错的代码片段)。

但是您是否意识到,在您的 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]; 

因为你有两个变量points,一个是类变量,第二个是作为参数传递的。如果发生这种情况,this则选择不使用非类变量。

于 2013-10-30T23:42:49.713 回答
0

可能是因为您要添加1到用户给出的维度:

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

这导致数组比 的值多一列dimension

于 2013-10-30T23:46:01.740 回答