我最初想创建一个“方法” Min,它将搜索一个数组的最小值并返回两个元素。一个代表最小值,另一个代表这个值的索引。为了做到这一点,我决定创建一个 Min 类和一个构造函数,将这两个元素存储为可通过 getter 和 setter 访问的实例变量(一个 double 和一个 int )。
棘手的部分是,我想重载我的类,并添加第二个构造函数,这个构造函数将使用 2D 数组作为输入并有两个其他实例变量(一个 double[] 和一个 int[])。
它正在工作,但是我很不舒服,因为我可以使用第一个构造函数创建这个类的实例,并且仍然可以访问对这个构造函数没有意义的其他两个变量,反之亦然。
我可以为我的第二个构造函数创建一个完全不同的类来解决这个问题(例如:一个类 Min_array 和 Min_2Darray),但是我希望它们具有相同的名称,因为它代表相同类型的操作。
我相信应该有一种比我选择的更优雅的重载和检索多个结果的方法,我会很高兴得到一些建议或知道你的最佳实践是什么。谢谢你。
我的第二个(更小的)担心是我必须在构造函数 2 中创建很多构造函数 1 的实例,这在内存分配方面似乎很奇怪并且根本没有效率。
我的班级敏:
package operation;
public class Min {
// ---------------- Instance Variables ------------------
private int index = 0;
private double value = Double.POSITIVE_INFINITY; // important as i search for the MIN
private int[] ArrayIndex;
private double[] ArrayValue;
// ---------------- Constructor 01 ------------------
public Min(double [] anArray) {
for (int i = 0; i < anArray.length; i++) {
if (anArray[i] < this.value) {
this.value = anArray[i];
this.index = i;
}
}
}
// ---------------- Constructor 02 ------------------
public Min(double [][] a2DArray, boolean accordingToRow) {
int n_row = a2DArray.length;
int n_col = a2DArray[0].length;
if (accordingToRow == true) {
this.ArrayIndex = new int [n_row];
this.ArrayValue = new double [n_row];
for (int i = 0; i < n_row; i++) {
Min minofOneArray = new Min(a2DArray[i]); // Here i call and create multiple instance of constructor 01.
this.ArrayIndex[i] = minofOneArray.getIndex();
this.ArrayValue[i] = minofOneArray.getValue();
}
}else { // accordingToRow == false (so it according to Column now)
this.ArrayIndex = new int [n_col];
this.ArrayValue = new double [n_col];
//need to loop to extract a column in this case
double[] tmpArray = new double [n_row];
for (int j = 0; j < n_col; j++) {
for (int i = 0; i < n_row; i++) {
tmpArray[i] = a2DArray[i][j];
}
Min minofOneArray = new Min(tmpArray);
this.ArrayIndex[j] = minofOneArray.getIndex();
this.ArrayValue[j] = minofOneArray.getValue();
}
}
}
// ---------------- Getters & Setters ------------------
public int getIndex() {return this.index ; }
public double getValue() {return this.value ; }
public int[] getArrayIndex() {return this.ArrayIndex ; }
public double[] getArrayValue() {return this.ArrayValue ; }
}
我班 Min 的测试:
package operation_test;
import java.util.Arrays;
import operation.Min;
class Test_MIN {
public static void main(String[] args) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>> Test of the Min Class <<<<<<<<<<<<<<<<<<<<<<<<<<" );
double [] anArray = { 0, 2 , 1 , -2 , 5 };
Min minOfArray = new Min(anArray);
System.out.println(minOfArray.getIndex());
System.out.println(minOfArray.getValue());
System.out.println("--------------- End of test 01 -----------------" );
double [][] a2DArray = {{0.2,5,-1},{1,3,0.5}};
// 0 5 -1
// 1 3 0.5
Min minOf2DArray = new Min(a2DArray, true); // according to row
System.out.println(Arrays.toString(minOf2DArray.getArrayIndex()));
System.out.println(Arrays.toString(minOf2DArray.getArrayValue()));
System.out.println("--------------- End of test 02 -----------------" );
Min minOf2DArray_AccordingToCol = new Min(a2DArray, false); // according to column
System.out.println(Arrays.toString(minOf2DArray_AccordingToCol.getArrayIndex()));
System.out.println(Arrays.toString(minOf2DArray_AccordingToCol.getArrayValue()));
System.out.println("--------------- End of test 03 -----------------" );
}
}
我的班级 Min 的结果:
>>>>>>>>>>>>>>>>>>>>>>>> Test of the Min Class <<<<<<<<<<<<<<<<<<<<<<<<<<
3
-2.0
--------------- End of test 01 -----------------
[2, 2]
[-1.0, 0.5]
--------------- End of test 02 -----------------
[0, 1, 0]
[0.2, 3.0, -1.0]
--------------- End of test 03 -----------------