2014-05-23 1 views
0

j'ai un Arraylist avec des objetscollection Java: vérifier la propriété d'objet

mon Object Model

class MyData{ 
     public int property; 
     public String section; 
    } 

et moi avons une fonction comme celui-ci

boolean preselectionDefined; 
    int position=0; 
    private String setSection(ArrayList <MyData> myDatas) { 
    int accountCount = myDatas.size(); 

    String sectionId = ""; 

    if (preselectionDefined) { 
      //First i check the "section" property of object . 
      //If i found a object "section" equals "HEAD" i will stop iteration 
    for (int i = 0; i < accountCount; i++) { 
     MyData sectionA = myDatas.get(i); 
     if (sectionA.section.equalsIgnoreCase("HEAD")) { 
      sectionId = "A"; 
          position=i; 
      return sectionId; 
     } 
    } 
       //if i didn't find "section" property of object as "HEAD" in any item in list. 
      //Again i iterate. If i found a object "section" equals "SENIOR" i will stop iteration 
    for (int i = 0; i < accountCount; i++) { 
     MyData sectionA = myDatas.get(i); 
     if (sectionA.section.equalsIgnoreCase("SENIOR")) { 
      sectionId = "B"; 
          position=i; 
      return sectionId; 
     } 
    } 
       //if i didn't find "section" property of object as "SENIOR" in any item in list. 
      //Again i iterate. If i found a object "section" equals "JUNIOR" i will stop iteration 
    for (int i = 0; i < accountCount; i++) { 
     MyData sectionA = myDatas.get(i); 
     if (sectionA.section.equalsIgnoreCase("JUNIOR")) { 
      sectionId = "C"; 
          position=i; 
      return sectionId; 
     } 
    } 
} 
    // if all the above conditions failed default will happen . 
    // Default Section Id if it's selection is not defined 
    sectionId = myDatas.get(position).section; 
    return sectionId; 
} 

Je pense que ce code vous aide à comprendre ce que je fais, (je suis vraiment désolé je ne suis pas capable d'exprimer mes besoins en mots). Existe-t-il un meilleur moyen d'atteindre cette fonctionnalité sans ces itérations et vérification?

EDIT: Je ne définis pas l'ID à mes objets dans la liste de tableau. Si la propriété de l'objet satisfait mon besoin je vais arrêter l'itération. Premièrement je vais itérer la liste pour trouver "HEAD" si j'ai trouvé un je vais arrêter mon itération, si n'a pas trouvé "HEAD", i va vérifier "SENIOR" par une répétition de l'itération de la liste entière pour encore une fois. Si je trouve un "SENIOR" dans la liste, je vais arrêter l'itération à ce point. Si ce n'est pas encore je vais vérifier pour vérifier "JUNIOR". et je suis vraiment désolé une chose que j'oublie de mentionner et j'ai besoin de la position de l'objet dans la liste de tableau où s'arrête l'itération.

Ceci est mon scénario. Je pense que mon approche est une mauvaise chose ne quelqu'un a une meilleure idée

Répondre

0

essayez ceci:

if (preselectionDefined) { 
    for (int i = 0; i < accountCount; i++) { 
     MyData sectionA = myDatas.get(i); 
     if (sectionA.section.equalsIgnoreCase("HEAD")) { 
      sectionId = "A"; 
      return sectionId; 
     } else if (sectionA.section.equalsIgnoreCase("SENIOR")) { 
      sectionId = "B"; 
      return sectionId; 
     } else if (sectionA.section.equalsIgnoreCase("JUNIOR")) { 
      sectionId = "C"; 
      return sectionId; 
     } 
    } 
} 
+0

Lorsque vous utilisez Java 7, vous pouvez l'écrire encore plus court en utilisant switch/case. – jornane

0

Même meilleure approche

if (preselectionDefined) { 
    for (MyData data : myDatas) { 
     if (data.section.equalsIgnoreCase("HEAD")) { 
      sectionId = "A"; 
     } else if (data.section.equalsIgnoreCase("SENIOR")) { 
      sectionId = "B"; 
     } else if (data.section.equalsIgnoreCase("JUNIOR")) { 
      sectionId = "C"; 
     } 
    } 
     return sectionId; 
} 

En Java 7

if (preselectionDefined) { 
    for (MyData data : myDatas) { 
     switch (data) { 
      case "HEAD": 
       sectionId = "A"; 
      break; 
      case "SENIOR": 
       sectionId = "B"; 
      break; 
      case "JUNIOR": 
       sectionId = "C"; 
      break; 
     }     
    } 
return sectionId; 
} 
1

I implémenterait Comparable et ferait une Méthode statique pour obtenir le SectionId de la valeur Comparable Returns; Puis appelez Collections.min() au lieu de la boucle et appelez la méthode statique pour obtenir la chaîne pour la valeur de l'ID de minimun. Alors chaque détail serait dans la classe MyData.

La classe MyData

class MyData implements Comparable, SectionId { 
    public int property; 
    public String section; 

    public int compareTo(MyData o) 
     if (o.section.equals("HEAD") { 
      return 100; 
     } else if (o.section.equalsIgnoreCase("SENIOR")) { 
      return 50; 
     } else if (o.section.equalsIgnoreCase("JUNIOR")) { 
      return 10; 
     } 
     return 0; 
    } 

    public static String parseSectionId(MyData o) { 
     if (o.section.equals("HEAD")) { 
      return "A"; 
     } else if (o.section.equalsIgnoreCase("SENIOR")) { 
      return "B"; 
     } else if (o.section.equalsIgnoreCase("JUNIOR")) { 
      return "C"; 
     } else { 
      return ""; // DEFAULT 
     } 
    } 
} 

La boucle ne serait pas nécessaire, au lieu du Collection.max() - Méthode renverrait la SectionId maximale - Ensuite, vous pouvez analyser ce maxid à la chaîne littéraux appropriée:

boolean preselectionDefined; 

private String setSection(ArrayList <MyData> myDatas) { 
    int accountCount = myDatas.size(); 

    String sectionId = ""; // Set Default here 
    if (preselectionDefined) { 
     sectionId = MyData.parseSectionId(Collections.max(myDatas)); 
    } 

    return sectionId; 
} 
+0

merci et vraiment, désolé s'il vous plaît voir mon edit j'avais expliqué le scénario, j'ai aussi besoin de la position de l'objet qui a choisi de la liste c'est pourquoi je l'itérer dans les boucles. C'est mon erreur de mentionner que plus tôt n'a pas de metion je m'excuse pour que – edwin

+0

Collections.min/max() - Méthode retourne un objet - je l'appelle o. Avec myDatas.indexof (o) vous obtenez la position de o dans la liste. Mais cela ne fonctionnerait que pour l'exemple, si vous ne pouvez avoir que 1 HEAD, 1 Senior et 1 Junior - parce que la méthode Collection-min/max itère dans l'ordre naturel. Je pense que vous devriez itérer dessus et enregistrer la position dans une variable temp pour reconnaître la position. Mais qu'est-ce que vous avez besoin de la position pour? – duffy356

+0

Désolé pour la réponse tardive. J'aime votre approche. Mais ma liste peut contenir beaucoup de HEAD, Senior et Junior, peut-être aucun d'entre eux sera là. Cela dépend de mon web-service. J'ai besoin de position pour d'autres fonctionnalités .Veuillez vérifier la modification dans mon code J'ai ajouté quelques commentaires pense que cela va vous aider à comprendre mon besoin – edwin

0

Ce que je ne l'étais, je modifie ma classe de modèle

class MyData{ 
     public int property; 
     public String section; 
     public int sectionId; //A new property 

    } 

et d ID efined pour la section

public static final int HEADER_ID= 1; 
public static final int SENIOR_ID = 2; 
public static final int JUNIOR_ID=3; 
public static final int DEFAULT_ID =4; 

Et tout en créant l'objet de MyData je placerai ce sectionId dépend aussi de la section

boolean preselectionDefined; 
    int position=0; 
    private String setSection(ArrayList <MyData> myDatas) { 
    int accountCount = myDatas.size(); 

    String sectionId = ""; 

    if (preselectionDefined) { 
    MyData data=Collections.min(myDatas, new Comparator<MyData >() { 
    @Override 
    public int compare(MyData lhs, MyData rhs) { 
    return Integer.valueOf(lhs.sectionId).compareTo(Integer.valueOf(rhs.sectionId)); 
     } 
    }); 
    position=myDatas.indexOf(data) 

} 
    // if all the above conditions failed default will happen . 
    // Default Section Id if it's selection is not defined 
    sectionId = myDatas.get(position).section; 
    return sectionId; 
} 

cette résolu mon problème.Merci @ duffy356 pour m'avoir donné l'idée

Questions connexes