Могу ли я назначить значения Java из ArrayList различным переменным без жесткого определения размера? - PullRequest
4 голосов
/ 16 сентября 2011

У меня есть ArrayList, и мы скажем, что он может иметь максимальный размер 5. Я хочу назначить первый элемент для var1, второй для var2, третий для var3 и т. Д.

Однако иногда ArrayList будет иметь менее 5 элементов, и в этом случае я не буду присваивать некоторым переменным значение.

Итак, мой вопрос, есть ли лучший способ сделать это, кроме:

if (myArrayList.size() > 0)
    var1 = myArrayList.get(0);
if (myArrayList.size() > 1)
    var2 = myArrayList.get(1);
if (myArrayList.size() > 2)
    var3 = myArrayList.get(2);
if (myArrayList.size() > 3)
    var4 = myArrayList.get(3);
if (myArrayList.size() > 4)
    var5 = myArrayList.get(4);

Ответы [ 5 ]

12 голосов
/ 16 сентября 2011

Источником этого, безусловно, является плохой дизайн кода. Кроме того, что вы инициализируете переменную, если arraylist не содержит поле (в конце концов вы используете его позже)? Здесь может помочь более крупный пример или то, что вы пытаетесь сделать. Обычно просто используя

Но я могу придумать как минимум два способа сделать это:

    switch(myArrayList.size()) {
    case 5:
        var4 = myArrayList.get(4);
    case 4:
        var3 = myArrayList.get(3);
    case 3:
        var2 = myArrayList.get(2);
            // and so on
    }

или просто используйте попытку / поймать.

    try {
        var0 = myArrayList.get(0);
        var1 = myArrayList.get(1);
    }
    catch(IndexOutOfBoundsException ex){
    }

Но, безусловно, лучше использовать сам arraylist и просто дополнить его значениями по умолчанию, которые вы иначе использовали бы для своих переменных.

3 голосов
/ 16 сентября 2011

Самый простой способ сделать это:

Object[] vars = myArrayList.toArray(new Object[5]);

Если вы настаиваете на использовании переменных от var1 до var5, а не на использовании элементов массива, скопируйте элементы массива в переменные. В качестве альтернативы вы можете заменить все экземпляры в вашем коде "= varN" на "= myArrayList.get (n)".

1 голос
/ 28 сентября 2012

Как насчет использования отдельного массива и назначения значения для каждого массива для соответствующего значения в списке в цикле?

for (i = 0; i<= 5; i++) {
var [i] = myArrayList.indexOf(i);
}
1 голос
/ 16 сентября 2011

Я согласен с Voo, что это скорее всего из-за плохого дизайна кода. Но для меня это возможность продемонстрировать свою любовь к конечным переменным и троичным выражениям. :-) Как это? (Для прикола я предполагаю ArrayList of Strings.)

final Iterator<String> iter = myArrayList.iterator();
final String var1 = iter.hasNext() ? iter.next() : null;
final String var2 = iter.hasNext() ? iter.next() : null;
final String var3 = iter.hasNext() ? iter.next() : null;
final String var4 = iter.hasNext() ? iter.next() : null;
final String var5 = iter.hasNext() ? iter.next() : null;
0 голосов
/ 16 сентября 2011

Описанный дизайн выглядит действительно безобразно.Вы можете использовать троичный оператор для желаемой цели, хотя:

var1 = myArrayList.size() > 0 ? myArrayList.get(0) : "null";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...