поэтому в основном я пытался вызвать метод, который возвращает массив из другого класса java, он отлично работает, за исключением того, что он удваивает размер или длину массива в 2 раза по сравнению с оригиналом. вот мой код для возврата массива и длины.
public static double [] get_days(){
//extracted days from table into array
readFile();
double[] data = new double[list.size()];
System.out.println(list.size());
Integer[] daysArray = list.stream().map(Product::getDay)
.toArray(Integer[]::new);
for(int i = 0; i < daysArray.length; i++){
data[i] = Double.valueOf(daysArray[i]) ;
}
System.out.println("Array Size (Supposed to have 230 Data only) "+ data.length);
return data;
}
вот как я вызываю метод в другом классе
public class order_Picking extends AbstractProblem{
get_Product test = new get_Product();
public order_Picking(){
super(161,1,1);
}
public double [] var = new double[numberOfVariables];
public double [] Days = test.get_days();
@Override
public void evaluate (Solution solution){
System.out.println(Days.length);
//Jumlah produk pada batch ke-i pada picking list ke-i pada lokasi yang ke-i
for(int i=0; i< var.length;i++){
var[i]= EncodingUtils.getInt(solution.getVariable(i));
}
//jumlah ketersedian produk
int k1 = 100;
int k2 = 250;
int k3 = 150;
//Picking list-1
double [] pl1 = new double[3] ;
int p1 =100;
pl1[0]= p1;
int p2 = 20;
pl1[1]= p2;
int p3 = 40;
pl1[2]= p3;
int totalpl1 = p1+p2+p3;
//picking list-2
double [] pl2 = new double[3] ;
int p4 = 10;
pl2[0]= p4;
int p5 = 20;
pl2[1]= p5;
int p6 = 15;
pl2[2]= p6;
int totalpl2 = p4+p5+p6;
// Fungsi Tujuan untuk minimasi jarak
double f1 = distance(var) ;
double c1 = 0;
double c2 = 0;
for (int i = 0 ; i < var.length;i++){
c1 = (var[i]+var[i]*var[i])-totalpl1 ;
}
for (int i = 0 ; i < var.length;i++){
c2 = (var[i]+var[i]*var[i])-totalpl2 ;
}
//constraint picking list-1
//constraint picking list-2
solution.setObjective(0, f1);
solution.setConstraint(0,c1 == 0.0 ? 0.0 : c1);
solution.setConstraint(0,c2 == 0.0 ? 0.0 : c1);
}
@Override
public Solution newSolution() {
Solution solution = new Solution(161, 1, 1);
for (int i = 0 ; i<var.length;i++){
solution.setVariable(i,EncodingUtils.newBinaryInt(0,1));
}
return solution;
}
public static void main(String[] args) {
order_Picking value = new order_Picking();
NondominatedPopulation result = new Executor()
.withAlgorithm("GA")
.withProblemClass(order_Picking.class)
.withProperty("Populationsize",100)
.withProperty("sbx.rate",0.2)
.withProperty("pm",0.5)
.withMaxEvaluations(10000)
.run();
for (Solution solution : result) {
if (solution.violatesConstraints()) {
System.out.println("Solution for index 0 : " + +solution.getObjective(0));
for (int i = 0; i < value.var.length; i++){
System.out.println("Solusi variabel ke-"+i+" adalah "+ solution.getVariable(i));
}
}
}
}
public double distance (double [] x){
double a = 0;
for (int i = 0; i < x.length ; i++){
a += x[i];
}
return a;
}
}
В этом методе нет ничего плохого, но когда я вызывал его в других классах за пределами public static void main, он, кажется, запускается дважды, поскольку возвращает размер массива больше 230, я не понимаю, почему он становится 460, хотя он должен был быть 230 вот результат в консоли
Я относительно новый разработчик Java, поэтому простите меня, если это совершенно неверно, но предполагается ли, что Целое[] днейМассив вместо этого использует тип данных интервал []? Очевидно, я понимаю, что применение list.stream().map(Product::getDay).toArray(Integer[]::new); потребует этого, если вы назначите новый Целое[], но не могли бы вы вместо этого использовать (int[] :: новый)? Опять же, новый разработчик, так что это может быть далеко, ха-ха
Где объявлен список из метода получить_дней()? Я вижу, что при назначении пространства для двойные [] данные используется размер указанного объекта, и - возможно, он есть, но я его просто упускаю - я не вижу, где это объявлено.
В этом методе нет ничего плохого, но когда я вызывал его в других классах за пределами public static void main, он, кажется, запускается дважды, поскольку возвращает размер массива больше 230, я не понимаю, почему он становится 460, хотя он должен был быть 230
Я действительно не вижу ни вашу переменную список, ни ваш метод читатьФайл() (извините, если это слишком очевидно, и я тяну фейспалм). Моя текущая гипотеза такова: когда вы читаете файл, возможно, вы не очищаете место назначения, а просто загружаете дополнительные данные, ведущие к удвоению.
Может быть, это StringBuilder уровня класса? Пожалуйста, включите эту часть в свой вопрос :)
private StringBuilder list = null;
Затем внутри метода чтения файла:
public static void readFile()
{
// can empty with a new instance
list = new StringBuilder();
// or reset the length
list.setLength(0);
...
// perform reading, now with an empty StringBuilder
}
Без ^ это ^ вы могли бы сделать что-то похожее на следующий пример:
list = new StringBuilder("1").append(", ").append("2");
readFile(); // in method -> list.append("1").append(", ").append("2");
Что даст StringBuilder вывод:
["1", ", ", "2", "1", ", ", "2"]
При длине 6 вместо желаемого:
["1", ", ", "2"]
С длиной 3. Я мог видеть, что это отвечает за точный двойной счет.
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.