将字符串数组转换为数组列表

时间:2019-05-28 11:13:37

标签: java arrays list for-loop instantiation

我有一个带有名称和ID的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 个答案:

答案 0 :(得分:3)

移动

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 :(得分:1)

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;
}

答案 2 :(得分:1)

问题的根本原因是,如@StefanBeike所写,您仅在for循环之前实例化对象一次,然后继续重写其属性。在for循环内移动实例化(=调用new)可以修复该功能。

但是,除此之外,在for循环体内增加for循环变量是非常不好的做法。这样一来,您的意图就会变得晦涩,您将获得一个可读性差,难以维护且易于被以后的更改破坏的代码。

并且主要条件应该为i < newImageVal.length-1,以安全地处理数组大小。 (要确保100%不会得到ArrayIndexOutOfBoundsException。)

有多种更好的方法。

在for循环“标题”中增加2:

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);
}

答案 3 :(得分:0)

或者您可以使用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())