web-dev-qa-db-fra.com

Recherche dans une liste de tableaux avec des objets personnalisés pour certaines chaînes

J'ai un ArrayList avec des objets personnalisés. Je veux rechercher dans cette ArrayList for Strings.

La classe pour les objets ressemble à ceci:

public class Datapoint implements Serializable {

  private String stateBased;
  private String name;
  private String priority;
  private String mainNumber;
  private String groupadress;
  private String dptID;

  public Datapoint(){
  }

  public String getMainNumber() {
    return mainNumber;
  }

  public void setMainNumber(String mainNumber) {
    this.mainNumber = mainNumber;
  }

  public String getName() {
    return name;
  }

  ..and so on

Je sais comment rechercher une chaîne dans ArrayList mais comment le faire dans ArrayList avec mes objets personnalisés:

ArrayList<String> searchList = new ArrayList<String>();
String search = "a";
int searchListLength = searchList.size();
for (int i = 0; i < searchListLength; i++) {
if (searchList.get(i).contains(search)) {
//Do whatever you want here
}
}

Je veux donc avoir une fonction à rechercher dans mon ArrayList avec par exemple cinq objets pour toutes les chaînes "name".

59
Mokkapps

Le moyen le plus simple est de créer un for afin de vérifier si l'attrtibute name de l'objet personnalisé contient la chaîne souhaitée.

    for(Datapoint d : dataPointList){
        if(d.getName() != null && d.getName().contains(search))
           //something here
    }

Je pense que cela vous aide.

90
Renato Lochetti

UPDATE: Utilisation de la syntaxe Java 8

List<DataPoint> myList = new ArrayList<>();
//Fill up myList with your Data Points

List<DataPoint> dataPointsCalledJohn = 
    myList
    .stream()
    .filter(p-> p.getName().equals(("john")))
    .collect(Collectors.toList());

Si cela ne vous dérange pas d'utiliser un libaray externe - vous pouvez utiliser Prédicats à partir de bibliothèque Google Guava comme suit:

class DataPoint {
    String name;

    String getName() { return name; }
}

Predicate<DataPoint> nameEqualsTo(final String name) {
    return new Predicate<DataPoint>() {

        public boolean apply(DataPoint dataPoint) {
            return dataPoint.getName().equals(name);
        }
    };
}

public void main(String[] args) throws Exception {

    List<DataPoint> myList = new ArrayList<DataPoint>();
    //Fill up myList with your Data Points

    Collection<DataPoint> dataPointsCalledJohn =
            Collections2.filter(myList, nameEqualsTo("john"));

}
39
munyengm

essaye ça

ArrayList<Datapoint > searchList = new ArrayList<Datapoint >();
String search = "a";
int searchListLength = searchList.size();
for (int i = 0; i < searchListLength; i++) {
if (searchList.get(i).getName().contains(search)) {
//Do whatever you want here
}
}
7
G_S

Pour qu'une classe personnalisée fonctionne correctement dans les collections, vous devez implémenter/remplacer les méthodes equals() de la classe. Pour le tri, remplacez également compareTo().

Voir cet article ou Google pour savoir comment implémenter correctement ces méthodes.

5
Ridcully

Probablement quelque chose comme:

ArrayList<DataPoint> myList = new ArrayList<DataPoint>();
//Fill up myList with your Data Points

//Traversal
for(DataPoint myPoint : myList) {
    if(myPoint.getName() != null && myPoint.getName().equals("Michael Hoffmann")) {
        //Process data do whatever you want
        System.out.println("Found it!");
     }
}
4
gtgaxiola

La méthode contains() appelle uniquement les éléments equals() sur ArrayList pour vous permettre de surcharger la classe equals() de votre classe en fonction de la variable de classe name. Renvoie true de equals() si name est égal à String correspondant. J'espère que cela t'aides.

2
Egor

Utilisez Apache CollectionUtils:

CollectionUtils.find(myList, new Predicate() {
   public boolean evaluate(Object o) {
      return name.equals(((MyClass) o).getName());
   }
}
1
MukeshKoshyM
boolean found;

for(CustomObject obj : ArrayOfCustObj) {

   if(obj.getName.equals("Android")) {

      found = true;
   }
}
0
Sayali Shinde
String string;
for (Datapoint d : dataPointList) {    
   Field[] fields = d.getFields();
   for (Field f : fields) {
      String value = (String) g.get(d);
      if (value.equals(string)) {
         //Do your stuff
      }    
   }
}
0
Greensy