繁体   English   中英

这是从 Java 列表中获取上一个、当前和下一个项目的最佳方法

[英]Which is the best way to get a previous, current and next item from a Java List

我有一个 object 用户

User
 id: Integer
 nickname : String
 score: Integer

以及按分数排序的用户列表:

id  name    score
3   John    90
2   Mike    80
4   Davi    30
5   Ana     20
6   Jane    10

我需要一个 function 返回带有参数传递的 Id 的用户,前一个值和下一个

例如:婴儿车 id = 4:

2   Mike    80
4   Davi    30
5   Ana     20

但是当id有最高分返回

例如:婴儿车 id = 2:

3   John    90
2   Mike    80
4   Davi    30

我总是需要返回一个包含 3 个值的列表

制作这个 function 的最佳方法是什么?

您不需要为此做任何特别的事情,只需要一个简单的循环。

public static List<User> getThree(List<User> input, int id) {
    int i = 0;
    while (i < input.size() && input.get(i).id != id) i++;
    List<User> res = new ArrayList<>();
    res.add(input.get(i - 1));
    res.add(input.get(i));
    res.add(input.get(i + 1));

    return res;
}

这当然假设没有非法情况,其中i - 1i + 1可能超出范围,但您可以为此添加检查,例如

if (i - 1 >= 0))

要么

if (i + 1 < input.size()) 

在相应的行之前。

可能有多种方法,但这是实现它的方法之一:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class User{
    int id;
    String nickName;
    int score;
    User(int id, String nickName, int score){
        this.id = id;
        this.nickName = nickName;
        this.score = score;
    }
    
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(id).append(" ").append( nickName ).append(" ").append(score);
        return sb.toString();
    }
}

public class JavaList {
    
    Map<Integer, Integer> idxMap;
    List<User> users;
    
    public JavaList() {
        idxMap = new HashMap<>();
        users = new ArrayList<>();
        users.add(new User(3, "John", 90));
        idxMap.put(3, 0);
        users.add(new User(2, "Mike", 80));
        idxMap.put(2, 1);
        users.add(new User(4, "Davi", 30));
        idxMap.put(4, 2);
        users.add(new User(5, "Ana",  20));
        idxMap.put(5, 3);
        users.add(new User(6, "Jane", 10));
        idxMap.put(6, 4);
    }
    
    public List<User> findThreeRecords(int id){
        if (! idxMap.containsKey(id)) throw new IllegalArgumentException("Invalid User id");
        int index = idxMap.get(id);
        List<User> resultList = new ArrayList<>();
        if (index-1 >= 0) resultList.add(users.get(index-1));
        resultList.add(users.get(index));
        if (index < users.size() ) resultList.add(users.get(index+1));
        
        return resultList;
    }

    public static void main(String[] args) {
        JavaList javaList = new JavaList();
        List<User> res = javaList.findThreeRecords(2);
        System.out.println(res);
        //This will print [3 John 90, 2 Mike 80, 4 Davi 30]
    }

}

暂无
暂无

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

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