1
votes

Convertir un tableau de chaînes en liste de tableaux

J'ai un tableau String avec le nom et l'identifiant, je dois convertir ce tableau String en Liste d'objets.

Ceci est mon code:

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

mais il y a un problème car il ne renvoie toujours que la dernière valeur dans objList . Quelqu'un peut-il corriger ce code?


0 commentaires

4 Réponses :


3
votes

déplacez

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

dans la boucle for:

ObjectAttribute object = new ObjectAttribute();


6 commentaires

C'est une très mauvaise pratique d'incrémenter la variable for-loop à nouveau à l'intérieur du corps de la boucle for. Avec votre expérience, vous ne devriez pas enseigner de telles choses aux débutants :)


@HonzaZidek c'est une erreur d'OP qui vient d'être copiée. Donc, vous n'avez pas à dire à StefanBeike mais à l'OP à la place;)


@Lino: Je pense que nous avons une certaine responsabilité dans nos réponses. Nous devons corriger non seulement leurs erreurs fonctionnelles, mais aussi leurs erreurs de conception. Les réponses SO sont très souvent utilisées par les débutants comme source de connaissances.


@HonzaZidek, vous êtes libre de publier votre propre réponse, ce qui le souligne. SO encourage des réponses différentes, qui répondent toutes à la même chose de différentes manières. Et si vous améliorez même le code d'OP, il obtiendra probablement beaucoup de commentaires positifs


@Honza Zidek oui bien sûr ..., mais ma réponse concerne le problème d'origine. pas à certains problèmes de guide de style de code ou aux meilleures pratiques.


De plus, la condition i <= newImageVal.length - 1 est trop optimiste, si le newImageVal ne contient pas un nombre pair d'éléments, il lancera ArrayIndexOutOfBoundException .



1
votes
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 commentaires

C'est une très mauvaise pratique d'incrémenter à nouveau la variable for-loop à l'intérieur du corps de la boucle for. Cela ne devrait pas être la solution acceptée car d'autres utilisateurs SO les utilisent comme des solutions modèles.


De plus, la condition i <= newImageVal.length - 1 est trop optimiste, si le newImageVal ne contient pas un nombre pair d'éléments, il lancera ArrayIndexOutOfBoundException .



0
votes

ou vous pouvez faire quelque chose comme ça en utilisant la méthode 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())


0 commentaires

1
votes

La cause première de votre problème est, comme @StefanBeike l'a écrit, que vous instanciez l'objet une seule fois avant la boucle for et que vous continuiez ensuite à réécrire ses attributs. Déplacer l'instanciation (= appel de new ) à l'intérieur de la boucle for corrige la fonctionnalité.

Cependant, à part cela, c'est une très mauvaise pratique d'incrémenter la variable for-loop dans le for -Boîte de boucle. Ainsi, vous obscurcissez votre intention et vous obtiendrez un code moins lisible, plus difficile à maintenir et plus facile à casser par des modifications ultérieures.

Et la condition principale devrait être i pour gérer la taille du tableau en toute sécurité. (Pour être sûr à 100% que vous n'obtenez pas ArrayIndexOutOfBoundsException.)

Il existe plusieurs meilleures façons.

Incrémenter de 2 dans l'en-tête de la boucle for " ":

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

Utilisez la boucle while au lieu de la boucle 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);
}


1 commentaires

C'est peut-être une erreur d'OP, cela semble assez spécial d'augmenter le i à deux endroits différents. Mais peu importe. Bonne réponse +1 :)