【问题标题】:Find the lowest 8 values in an ArrayList and highlight these in a TextView在 ArrayList 中查找最低的 8 个值并在 TextView 中突出显示这些值
【发布时间】:2020-09-15 12:29:51
【问题描述】:

我有一个ArrayList,其中保留了 20 个值,这 20 个值按日期顺序打印出来(1 个是最新的)我想在此列表中找到 8 个最低值,然后在打印输出中突出显示它们。

我在应用程序的其他部分使用 Collection.sort() 来查找 8 个最低值,但这会重新排列顺序,因此我无法按日期顺序突出显示它们。

有没有办法在不改变它们的顺序的情况下找到ArrayList 中的 8 个最低值?

为了澄清,最终目标是按输入顺序在页面上显示所有 20 个值。所以这些没有编号顺序。即它们可以是6,3,9,8,9,9,10,4 等。当显示时,我希望突出显示最低的 8 个值,因此对于上述数字,如果我希望突出显示最低的 3,它将是

"6"
"3"
9
"8"
9
9
10
"4"

引号中的数字被突出显示但留在打印输出的相同位置。

目前在我的display() 中,我使用s1.setText(masterlist.get(0) 等,所以我需要能够找到最低的8 个,然后对于这8 个使用s1.setBackgroundColor(Color.GREEN)

【问题讨论】:

  • 你可以复制 ArrayList。
  • 对原始 ArrayList 的副本进行排序。然后,您可以在打印原始列表时从那里获取有关 8 个最低值的信息。
  • originalList.stream().sorted().limit(8).collect(toList()).
  • 如果他们已经“按日期顺序”,你不能用originalList.subList(...)吗?
  • @AndyTurner 我想找到 8 个最低值。因此,如果例如值范围为 2 - 9 但不是按升序排列,我想找到最低的 8 个值,然后突出显示这些值,但保持它们按日期顺序排列....所以第 2、第 8、第 10 等可能是最低的并突出显示。

标签: java arraylist


【解决方案1】:

接受@andi-turner 的评论,这可能是你的方法:

void printHighlighted(List<String> originalList){
  Set<String> eightLowest = originalList.stream().sorted().limit(8).collect(Collectors.toSet());
  // print logic
  originalList.forEach(s-> {
       if(eightLowest.contains(s)){
           // replace by your actual print code
           System.out.println("BOLD: " + s);
       } else {
           // replace by your actual print code
           System.out.println(s);
       }
  }); 
}

【讨论】:

  • 如果您只是要调用forEach,则无需将它们收集到列表中。
  • 请注意 forEach 正在迭代原始列表,以保持原始 20 个值的顺序。也许我在这里理解错了
  • 我认为这不会起作用,因为我需要在 TextView 上为特定的 TextView 使用 setBackgroundColor。即如果 score1 是最低的 8 之一,我需要使用 s1.setBackgroundColor()
【解决方案2】:

你可以先得到一组中的最小值(假设值是整数)

Set<Integer> lowestValues = list.stream().sorted().limit(8).collect(Collectors.toSet());

然后过滤列表,如果包含在列表中,然后你会得到原始列表中的顺序。

List<Integer> res = list.stream()
                        .filter(e -> lowestValues.contains(e))
                        .limit(8)
                        .collect(Collectors.toList());

【讨论】:

  • 为什么要收集到一组呢?您从list.stream().sorted().limit(8) 中获得了 8 个最小值;直接将它收集到一个列表中。
  • @AndyTurner 实际上是为了获取列表中项目的原始顺序。
  • @Rono 谢谢。我已经使用了这个,所以现在有 8 个最低值,但我现在需要找到这些值在原始列表中并在页面上突出显示它们。
  • @JamesSmith 在第二部分中按顺序获得最低值。
  • 在您的空闲时间阅读这里stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2016-01-05
相关资源
最近更新 更多