Преобразовать массив строк в список массивов - PullRequest
1 голос
/ 28 мая 2019

У меня есть массив 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.Может ли кто-нибудь исправить этот код.

Ответы [ 4 ]

3 голосов
/ 28 мая 2019

ход

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);
}
1 голос
/ 28 мая 2019

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

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

И главное условие должно быть 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);
}
1 голос
/ 28 мая 2019
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;
}
0 голосов
/ 28 мая 2019

или вы можете сделать что-то подобное, используя способ 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())
...