Подтвердить что ты не робот

Поиск в ArrayList с пользовательскими объектами для определенных строк

У меня есть ArrayList с пользовательскими объектами. Я хочу искать внутри этого массива ArrayList для строк.

Класс для объектов выглядит следующим образом:

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

Я знаю, как искать строку в ArrayList, но как это сделать в ArrayList с моими пользовательскими объектами:

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

Итак, я хочу иметь функцию для поиска в моем ArrayList с пятью объектами для всех строк "name".

4b9b3361

Ответ 1

Простым способом является создание for, где вы проверяете, есть ли у atrrtibute name пользовательского объекта требуемая строка

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

Я думаю, это поможет вам.

Ответ 2

UPDATE: использование синтаксиса 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());

Если вы не против использования внешнего libaray - вы можете использовать Predicates из Google Guava library следующим образом:

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

}

Ответ 3

попробуйте это

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

Ответ 4

Для того, чтобы пользовательский класс работал правильно в коллекциях, вам придется реализовать/переопределить методы equals() этого класса. Для сортировки также переопределить compareTo().

Смотрите эту статью или google о том, как правильно реализовать эти методы.

Ответ 5

Возможно, что-то вроде:

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

Ответ 6

contains() метод просто вызывает элементы equals() on ArrayList, поэтому вы можете перегрузить класс equals() на основе переменной класса name. Верните true из equals(), если name равно совпадению String. Надеюсь, это поможет.

Ответ 7

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

Ответ 8

Используйте Apache CollectionUtils:

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