【问题标题】:Java - Map<String, List<Object>> iterate through list and skip first N entriesJava - Map<String, List<Object>> 遍历列表并跳过前 N 个条目
【发布时间】:2021-05-28 09:43:38
【问题描述】:

我对 Java 还很陌生,所以请宽容。我有一张地图,Map。我需要遍历这些值,跳过前 N 个索引并将剩余的内容添加到另一个列表中进行处理。

例如

Key:   foo
Value: [id=001, name=Fred, job=Mailman, age=51],
       [id=002, name=Johan, job=Musician, age=335],
       [id=003, name=Alice, job=Finance, age=49],
       [id=004, name=Marcus, job=Developer, age=41]

我按年龄降序排序,我需要跳过前 N 个列表条目。

下面的代码是我目前所在的位置。任何帮助表示赞赏。谢谢。

List<Object> finalList = new ArrayList<Object>();
List<Object> sortedList = new ArrayList<Object>();

Map<String, List<Object> map = getMapFn();

for(List<Object> anotherList : map.values()) {
   Collections.reverse(anotherList);
   sortedList = anotherList;

   for(Object o : sortedList) {
      int skipN = N;

      for(int i = 0; i < sortedList.size(); i++) {
         if(i < skipN) {
            continue;
         }
      }
      finalList.add(o);
   }
}

最终目标:

If N=2,
finalList = [id=003, name=Alice, job=Finance, age=49],
[id=004, name=Marcus, job=Developer, age=41]

【问题讨论】:

  • 请修正代码部分的格式。格式不正确的问题不太可能得到回答:)
  • 列表中对象的类是什么?

标签: java


【解决方案1】:

在您的代码中,sortedList 中的项目将始终添加到 finalList

   int skipN = N;
   int index = 0;
   for(Object o : sortedList) {
      if(index<skipN){
          index++;
          contine;
      }
      index++;
      finalList.add(o);
   }

或者使用jdk1.8流

sortedList.stream().skip(skipN).collect(Collectors.toList())

【讨论】:

    【解决方案2】:

    你根本不需要内循环。

      int skipN = N;
      for(Object o : sortedList) {
          if (skipN-- > 0) {
             continue;
          }
          finalList.add(o);
      }
    

    【讨论】:

      【解决方案3】:

      您的第二个和第三个 for 循环将执行相同的任务。我想你不想要这个。 因此,删除第二个循环。第三个循环将是:

      • 使用sortedList.get(i)sortedList 中获取第N 项
      • 然后,将其添加到您的finalList
      for(int i = 0; i < sortedList.size(); i++) {
         if(i < skipN) {
            continue;
          }
         finalList.add(sortedList.get(i));
      }
      

      【讨论】:

        【解决方案4】:

        使用项目的子列表从中删除和删除所有项目:

        for (List<Object> list : map.values()) {
            Collections.reverse(list);
            list.subList(0, Math.min(list.size(), N)).clear();
        }
        

        这将创建一个包含第一个 N 项目的子列表(如果少于 N 项目,则创建整个列表),然后通过 .clear() 删除子列表中的所有项目。

        对子列表的修改会反映在原始列表中,因此删除会反映在原始列表中。


        为了兴趣,这里有一个单行版本:

        map.values().stream()
            .peek(Collections::reverse)
            .map(list -> list.subList(0, Math.min(list.size(), N))
            .forEach(List::clear);
        

        但它看起来不像上面的多行版本那样清晰。

        【讨论】:

          猜你喜欢
          • 2020-01-26
          • 2018-09-22
          • 1970-01-01
          • 2013-05-17
          • 2022-01-17
          • 2020-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多