繁体   English   中英

如何从 java 中的 class object 列表中获取第一个匹配元素的索引(不使用任何第三方库)

[英]How to get index of first matched element from the list of class object in java (Without using any third party Library)

我有一个 class object 列表(列表)。 我想从具有特定用户状态的列表中获取第一个用户的索引。

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() 方法

您可以使用 Java 流和选项来执行此操作

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

if(firstMatchingUserOptional.isPresent())
    int firstMatchingUserIndex = userList.indexOf(firstMatchingUserOptional.get());

只需遍历列表,当您发现AVAILABLE从循环返回时。

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

您可以使用

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

作为旁注,class 名称应反映 class 的单个实例所代表的内容,即当一个 object 代表单个用户时, User而不是Users 此外,无需将enum常量的名称传递给它们自己。 他们确实已经知道他们的名字。

当您将类型声明为

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

调用UserStatus.AVAILABLE.name()将为您提供字符串"AVAILABLE"并调用UserStatus.valueOf("AVAILABLE")将返回常量UserStatus.AVAILABLE 你不需要自己实现这样的逻辑。

你可以使用 for 循环;

就像是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM