Функциональный цикл более одного раза java

поэтому в основном я пытался вызвать метод, который возвращает массив из другого класса 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 вот результат в консоли

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Community 06.05.2022 21:42

Я относительно новый разработчик Java, поэтому простите меня, если это совершенно неверно, но предполагается ли, что Целое[] днейМассив вместо этого использует тип данных интервал []? Очевидно, я понимаю, что применение list.stream().map(Product::getDay).toArray(Integer[]::new); потребует этого, если вы назначите новый Целое[], но не могли бы вы вместо этого использовать (int[] :: новый)? Опять же, новый разработчик, так что это может быть далеко, ха-ха

Kemper Lee 07.05.2022 01:15

Где объявлен список из метода получить_дней()? Я вижу, что при назначении пространства для двойные [] данные используется размер указанного объекта, и - возможно, он есть, но я его просто упускаю - я не вижу, где это объявлено.

Kemper Lee 07.05.2022 01:30

В этом методе нет ничего плохого, но когда я вызывал его в других классах за пределами public static void main, он, кажется, запускается дважды, поскольку возвращает размер массива больше 230, я не понимаю, почему он становится 460, хотя он должен был быть 230

Jansen Stanlie 07.05.2022 02:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я действительно не вижу ни вашу переменную список, ни ваш метод читатьФайл() (извините, если это слишком очевидно, и я тяну фейспалм). Моя текущая гипотеза такова: когда вы читаете файл, возможно, вы не очищаете место назначения, а просто загружаете дополнительные данные, ведущие к удвоению.

Может быть, это 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. Я мог видеть, что это отвечает за точный двойной счет.

Другие вопросы по теме