Как получить индекс первого соответствующего элемента из списка объектов класса в java (без использования сторонней библиотеки) - PullRequest
0 голосов
/ 24 апреля 2020

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

public enum UserStatus {
    CREATED("CREATED"),
    AVAILABLE("AVAILABLE"),
    CHECKIN("CHECKIN"),
    CHECKOUT("CHECKOUT"),
    ON_TRIP("ONTRIP"),
    UNAVAILABLE("UNAVAILABLE");
 }

  Class Users{
        private Long id;
        private Long userId;        
        private UserStatus userStatus;
        private Date createdAt;
    }

Class Main{
    public static void main(String args[]){
        List<Users> userList = getListofUser(); // this method will give me list of users

        // here I want to find the first user whose status is AVAILABLE

    }
}

Я ищу аналогичный по методу List indexOf ()

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Вы можете использовать

int index = IntStream.range(0, userList.size())
    .filter(ix -> userList.get(ix).getUserStatus() == UserStatus.AVAILABLE)
    .findFirst().orElse(-1);

Если вы не хотите использовать Stream API или подозреваете, что в списке отсутствует эффективный произвольный доступ, вы можете использовать

int index = -1;
for(ListIterator<Users> i = userList.listIterator(); i.hasNext(); ) {
    if(i.next().getUserStatus() == UserStatus.AVAILABLE) {
        index = i.previousIndex();
        break;
    }
}

В качестве примечания, имя класса должно отражать то, что представляет отдельный экземпляр класса, то есть User вместо Users, когда один объект представляет одного пользователя. Кроме того, нет необходимости передавать имена enum констант себе. Они уже знают свои имена.

Когда вы объявляете тип как

public enum UserStatus {
   CREATED,
   AVAILABLE,
   CHECKIN,
   CHECKOUT,
   ON_TRIP,
   UNAVAILABLE
}

, вызов UserStatus.AVAILABLE.name() выдаст вам строку "AVAILABLE", а вызов UserStatus.valueOf("AVAILABLE") вернет константу UserStatus.AVAILABLE. Вам не нужно реализовывать такую ​​логику c самостоятельно.

1 голос
/ 24 апреля 2020

Вы можете сделать это, используя Java потоков и опций

Optional<User>firstMatchingUserOptional = userList.stream.filter(user -> user.getUserStatus().equals(UserStatus.AVAILABLE)).findFirst();

if(firstMatchingUserOptional.isPresent())
    int firstMatchingUserIndex = userList.indexOf(firstMatchingUserOptional.get());
1 голос
/ 24 апреля 2020

Просто переберите список, и когда вы найдете AVAILABLE, вернитесь с l oop.

Users getFirstAvailableUser(List<Users> userList ) {

   Iterator<Users> it = userList.iterator();
   while ( it.hasNext() ) {
      Users curr = it.next();
      if ( curr.getUserStatus() == UserStatus.AVAILABLE ) {
         return curr;
      }
   }

   return null;
}
0 голосов
/ 24 апреля 2020

вы можете использовать для l oop;

что-то вроде

`for(User tempUser : userList){
 if(tempUser.UserStatus.equals(UserStatusTemp)){
 //do job
 break;
  }
  }`
...