Java - вектор всегда имеет одинаковые результаты - PullRequest
0 голосов
/ 28 сентября 2011

Я читаю файл .ini и помещаю каждое свойство во временный массив, который я помещаю в конце в вектор - пока здесь он не работает нормально.

Но если я хочу получить доступ к каждому массиву в этом векторе, я ВСЕГДА получаю одинаковые результаты, что невозможно. Я пробовал это разными способами, разными циклами и все по-разному, но всегда с одинаковыми результатами, вот мой актуальный код:

    tmp2 = new String[2];
    for(Enumeration e=allPropertys.elements(); e.hasMoreElements();) {
        tmp2 = (String[])e.nextElement();
        for(int i = 0; i < tmp2.length; i++)
        {
            System.out.println(tmp2[i]);
        }
    }

А вот код, в который я помещаю все в вектор:

    try {
        tmp = new String[2];

        prop = new Properties();
        prop.load(new FileReader("konfig.ini"));

        Enumeration e = prop.propertyNames();
        while (e.hasMoreElements()) {

            String key = (String)e.nextElement();
            String value = prop.getProperty( key );
            tmp[0] = key + " " +  value;
            tmp[1] = value;

            System.out.println("Property: " + tmp[0] + " und Value: " + tmp[1]);
            allPropertys.add(tmp);
        }
    }

Ответы [ 2 ]

6 голосов
/ 28 сентября 2011

Я предполагаю, что когда вы заполняете свой вектор, вы повторно используете один и тот же массив строк для каждого свойства.Это заставляет ваш вектор содержать в 10 раз (10 из которых является числом записей) один и тот же массив:

String[] property = new String[2];
for (every line in the file) {
    property[0] = ...;
    property[1] = ...;
    vector.add(property);
}

Это должно быть заменено на

for (every line in the file) {
    String[] property = new String[2];
    property[0] = ...;
    property[1] = ...;
    vector.add(property);
}

Также обратите внимание на фрагмент кода,вы создаете новый массив String для инициализации вашей переменной tmp2, а затем заменяете ее значение значением в векторе.Инициализация не нужна.

0 голосов
/ 28 сентября 2011

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

Вы должны понимать, как работают объекты и массивы. Вы думаете, что добавление его в коллекцию копирует его или что-то еще (поэтому, я думаю, поэтому вы инициализируете массив перед циклом в части чтения). Это только добавляет ссылку. Вы всегда работаете со ссылками.

Вы должны создавать новый массив каждый раз, когда хотите его добавить. Думайте о переменной массива (или любой переменной объекта) как о ссылке на объект. Как стрела к реальной вещи. Когда вы добавляете его к вектору, вы добавляете стрелки к одной и той же структуре в памяти (те же самые две корзины).

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