Преобразование массива строк в список массивов

У меня есть массив String с именем и идентификатором, мне нужно преобразовать этот массив String в List объектов.

Это мой код:

private List<ObjectAttribute> getDtls(String newVal) {
    ObjectAttribute object = new ObjectAttribute();
    List<ObjectAttribute> objLst = new ArrayList<ObjectAttribute>();
    String[] newImageVal = [step0005.jpg, 172B6846-0073-4E5B-B10A-DDD928994EA6, step0003.jpg, FBC8D143-2CD7-47E6-B323-31A0928A9338]
    for (int i = 0; i <= newImageVal.length - 1; i++) {
        object.setImageName(newImageVal[i]);
        object.setImageId(newImageVal[++i]);
        objLst.add(object);
    }
    return objLst;
}

но есть проблема, что он всегда возвращает только последнее значение в objList. Может ли кто-нибудь исправить этот код.

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

Ответы 4

переехать

ObjectAttribute object = new ObjectAttribute();

внутри цикла for:

for (int i = 0; i <= newImageVal.length - 1; i++) {
    ObjectAttribute object = new ObjectAttribute();
    object.setImageName(newImageVal[i]);
    object.setImageId(newImageVal[++i]);
    objLst.add(object);
}

Практика очень плохой заключается в увеличении переменной цикла for опять таки внутри тела цикла for. Вы с вашим опытом не должны учить новичков таким вещам :)

Honza Zidek 28.05.2019 13:21

@HonzaZidek, это ошибка из OP, которая была просто скопирована. Так что вам не нужно говорить StefanBeike, а вместо этого OP;)

Lino 28.05.2019 13:23

@Lino: я думаю, что мы несем определенную ответственность за наши ответы. Мы должны исправить не только их функциональные ошибки, но и их ошибки в дизайне. Ответы SO очень часто используются новичками в качестве источника знаний.

Honza Zidek 28.05.2019 13:23

@HonzaZidek вы можете опубликовать свой собственный ответ, который указывает на это. SO поощряет разные ответы, которые по-разному отвечают на одно и то же. И если вы даже улучшите код из OP, возможно, вы получите много положительных отзывов.

Lino 28.05.2019 13:25

@Honza Zidek да, конечно ..., но мой ответ относится к исходной проблеме. не к некоторым проблемам с руководством по стилю кода или лучшим практикам.

s_bei 28.05.2019 13:25

Также условие i <= newImageVal.length - 1 слишком оптимистично, если newImageVal не содержит четного числа элементов, будет выброшено ArrayIndexOutOfBoundException.

Honza Zidek 28.05.2019 14:05
private List<ObjectAttribute> getDtls(String newVal) {
    List<ObjectAttribute> objLst = new ArrayList<ObjectAttribute>();
    String[] newImageVal = [step0005.jpg, 172B6846-0073-4E5B-B10A-DDD928994EA6, step0003.jpg, FBC8D143-2CD7-47E6-B323-31A0928A9338]
//  String delimiter = ", ";
//  newImageVal = newVal.split(delimiter);
    for (int i = 0; i <= newImageVal.length - 1; i++) {
        ObjectAttribute object = new ObjectAttribute();
        object.setImageName(newImageVal[i]);
        object.setImageId(newImageVal[++i]);
        objLst.add(object);
    }
    return objLst;
}

Это очень плохая практика — снова увеличивать переменную цикла for внутри тела цикла for. Это не должно быть принятым решением, поскольку другие пользователи SO используют их в качестве модельных решений.

Honza Zidek 28.05.2019 13:50

Также условие i <= newImageVal.length - 1 слишком оптимистично, если newImageVal не содержит четного числа элементов, будет выброшено ArrayIndexOutOfBoundException.

Honza Zidek 28.05.2019 14:05
Ответ принят как подходящий

или вы можете сделать что-то подобное, используя способ streams:

AtomicInteger ai = new AtomicInteger(); 
List<ObjectAttribute> objLst = Arrays.stream(newImageVal)
.map(img-> {
   ObjectAttribute object = new ObjectAttribute();
   object.setImageName(img);
   object.setImageId(ai.getAndIncrement()); 
   return obj;
 }).collect(Collectors.toList())

Основная причина вашей проблемы, как писал @StefanBeike, заключается в том, что вы создаете экземпляр объекта только один раз перед циклом for, а затем просто продолжаете переписывать его атрибуты. Перемещение экземпляра (= вызов new) внутри цикла for исправляет функциональность.

Однако, помимо этого, очень плохой практикой является увеличение переменной цикла for внутри тела цикла for. Таким образом, вы затемняете свое намерение и получаете код, который менее читабелен, сложнее в сопровождении и легче ломается последующими изменениями.

И главным условием должно быть i < newImageVal.length-1 безопасное обращение с размером массива. (Чтобы быть на 100% уверенным, что вы не получите ArrayIndexOutOfBoundsException.)

Есть несколько лучших способов.

Увеличьте на 2 в «заголовке» цикла for:

for (int i = 0; i < newImageVal.length-1; i += 2) {
    ObjectAttribute object = new ObjectAttribute();
    object.setImageName(newImageVal[i]);
    object.setImageId(newImageVal[i+1]);
    objLst.add(object);
}

Используйте цикл while вместо цикла for:

int i = 0;
while (i < newImageVal.length-1) {
    ObjectAttribute object = new ObjectAttribute();
    object.setImageName(newImageVal[i++]);
    object.setImageId(newImageVal[i++]);
    objLst.add(object);
}

Может быть, это ошибка со стороны OP, кажется совершенно особенным увеличивать i в двух разных местах. Но все таки. Хороший ответ +1 :)

Lino 28.05.2019 13:55

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