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".
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.
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"));
}
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
}
}
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.
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!");
}
}
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.
Utilisez Apache CollectionUtils
:
CollectionUtils.find(myList, new Predicate() {
public boolean evaluate(Object o) {
return name.equals(((MyClass) o).getName());
}
}
boolean found;
for(CustomObject obj : ArrayOfCustObj) {
if(obj.getName.equals("Android")) {
found = true;
}
}
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
}
}
}