代码之家  ›  专栏  ›  技术社区  ›  fawad

在列表中查找特定记录,并在该记录上方显示5条记录,在该记录下方显示5条记录

  •  2
  • fawad  · 技术社区  · 8 年前

    尝试在列表中查找特定记录,然后创建包含11条记录的子列表,即选定记录上方的5条记录和该记录下方的5条记录。

    可能的情况

    • 如果选定的列表是第一条记录,则只创建包含5的子列表 低于该记录的记录。
    • 如果选定列表是第一条记录并且 少于5条记录创建子列表,所有记录如下 那张唱片。
    • 如果选定列表是最后一条记录,则仅创建 在该记录之上有5条记录的子列表。
    • 如果选定列表是 最后一条记录,并且少于5条记录创建子列表 所有低于该记录的记录。

    下面是我目前的思考过程,肯定会在这个方法中加入更多的检查,有没有更好的方法或任何其他建议

        int s = myList.indexOf(tests);
            if (s == 0) {
                if (s + 2 < myList.size()) {
                    myList = myList.subList(s, s + 3);
                } else {
                    myList = myList.subList(s, s);
    
                }
    
            } else if (s == 0 && s + 1 > myList.size()) {
                myList = myList.subList(s, s);
            } else if (s - 1 > 0 && s + 1 < myList.size()) {
                myList = myList.subList(s - 1, s + 2);
            } else if (s + 1 >= myList.size()) {
                myList = myList.subList(s - 1, s + 1);
    
            } else if (s == myList.size() - 1) {
                if (s - 2 > 0) {
                    myList = myList.subList(s - 2, s + 1);
                } else {
                    myList = myList.subList(s, s + 1);
    
                }
    
            }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Ravindra Ranwala    8 年前

    试试这个,

    List<String> records = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
            "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen");
    final List<String> subRecords = IntStream.range(0, records.size()).filter(i -> records.get(i).equals("eight"))
            .mapToObj(i -> records.subList(Math.max(i - 5, 0), Math.min(i + 6, records.size())))
            .flatMap(List::stream).collect(Collectors.toList());
    

    注意我正在使用 List 属于 String 作为原始记录。根据你的改变。

    或者也可以这样做,

    final int midIdx = records.indexOf("eight");
    final int lowerBound = Math.max(midIdx - 5, 0);
    final int upperBound = Math.min(midIdx + 5, records.size());
    final List<String> subRecords = IntStream.range(0, records.size()).limit(upperBound + 1).skip(lowerBound)
            .mapToObj(records::get).collect(Collectors.toList());
    

    更新

    由于它简化了代码,所以我通过以下注释进行了建议的更改。