Как эффективно создать объект в течение или во время - PullRequest
0 голосов
/ 15 мая 2018

У меня такая структура программы.

Эта программа имеет одну функцию с именем run (), а другую функцию с именем solve ().

В этой программе я хочу получить некоторую информацию от run () и решить (). Также я хочу поместить эту информацию в один вектор списка (с именем information_one_iteration в следующем коде).

Поскольку эти векторы собираются вместе, чтобы сформировать матрицу (названная информация в следующем коде).

Вот почему я определяю information_one_iteration как статическую переменную, и в каждой новой итерации новые объекты определяются заново.

Но я знаю, что этот способ не эффективен! Как я могу улучшить это?

package java_test2;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Random;

public class staticvarTest {

private Random random = new Random();

static ArrayList<ArrayList<String>> information = new ArrayList<ArrayList<String>>();
static ArrayList<String> information_one_iteration = new ArrayList<String>();

public staticvarTest() {

}

public void run() {

    for (int i=0; i<10; i++) {

        information_one_iteration.add(String.valueOf(i));
        solve(); // add two random number generated in function solve()
        information.add(information_one_iteration);

        information_one_iteration = new ArrayList<String>();


    }
    print_information(information);
}

public void solve() {

    information_one_iteration.add(String.valueOf(random.nextInt()));
    information_one_iteration.add(String.valueOf(random.nextInt()));
}

public static void print_information(ArrayList<ArrayList<String>> information) {
    for (ArrayList<String> newLine : information) {
        ArrayList<String> list_set = newLine;
        System.out.println("");
        for(String data: list_set) {
            System.out.print(data+" ");
        }
        System.out.println("");
    }
    System.out.println("");
}

public static void main(String args[]) {

    staticvarTest na = new staticvarTest();
    na.run();
}
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Поскольку вы не используете static ArrayList<String> information_one_iteration = new ArrayList<String>(); где-либо, кроме метода запуска, вы можете удалить его.

Я изменил переменную random, так как это возможно для нескольких объектов, чтобы разделить ее - поведение остается тем же, поэтому нет необходимости инициализировать каждый раз, когда создается главный объект.

Измените метод решения, чтобы он также принимал ArrayList в качестве параметра.

print_information выглядит хорошо, но нет необходимости в ArrayList<String> list_set = newLine;

Я также сделал information переменной состояния над статической переменной, чтобы каждый экземпляр объекта мог иметь свою собственную информацию, что позволяет запускать несколько экземпляров этого класса.

Я также добавил лямбду, чтобы распечатать членов, чтобы дать вам представление о них newLine.forEach(data -> System.out.println(data + " "));.

Наконец, я использовал имена переменных и классов, которые соответствуют соглашениям о кодировании Java для лучшей читаемости. Вот одно из руководств по стилю, которым вы можете следовать https://google.github.io/styleguide/javaguide.html

Уточненная версия вашего кода ниже

package com.company;

import java.util.ArrayList;
import java.util.Random;

public class Main {
    private static Random random = new Random();
    private ArrayList<ArrayList<String>> information = new ArrayList<>();


    private void run() {
        for (int i=0; i<10; i++) {
            ArrayList<String> informationInIteration = new ArrayList<>();
            informationInIteration.add(String.valueOf(i));
            solve(informationInIteration); // add two random number generated in function solve()
            information.add(informationInIteration);
        }
        printInformation();
    }

    private void solve(ArrayList<String> iterationInformation) {
        iterationInformation.add(String.valueOf(random.nextInt()));
        iterationInformation.add(String.valueOf(random.nextInt()));
    }

    private void printInformation() {
        for (ArrayList<String> newLine : information) {
            System.out.println();
            newLine.forEach(data -> System.out.println(data + " "));
            System.out.println();
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.run();
    }
}

На основе ваших комментариев я добавляю метод, который не создает объекта для хранения какой-либо информации.

пакет com.company;

import java.util.Random;

public class Main {
    private Random random = new Random();


    private void run() {
        for (int i=0; i<10; i++) {
            System.out.println(String.valueOf(i));
            System.out.println(random.nextInt() + " " + random.nextInt() + "\n");
        }
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.run();
    }
}
0 голосов
/ 15 мая 2018

Это должно работать для вас.

public void run() {

    for (int i=0; i<10; i++) {
        staticvarTest.information.add(solve(String.valueOf(i)));
    }
    print_information(information);
}

public String[] solve(String i) {
    return {String.valueOf(random.nextInt()), 
            String.valueOf(random.nextInt()),
            i};
}

Или вы можете объединить массив, возвращенный в execute () и i String, и избежать передачи переменной.

Я не тестировал приведенный выше код, но кроме доступа и изменения статической переменной не должно быть проблем.

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...