猿问

比较每个列表中每个索引的项目

我有一个字符串列表的 arrayList

ArrayList<List<String>> temp = new ArrayList<List<String>>();

现在,假设我们有 3 个列表,例如:

  • 列表 1:[3,8,15,98]

  • 列表 2:[3,4,21,98]

  • 列表 3:[5,4,76,90]

我只想打印最小的列表。我的意思是具有最小升序的列表。例如,如果我们采用三个列表 abose :

  • 在索引 0 处:

列表 1 和 2 的项目 = 3

清单 3 的项目 = 5

3<5 所以我不会打印列表 3

  • 在索引 1 处:

列表项 1 = 8

列表 2 的项目 = 4

4<8 所以我必须打印列表 2

事实上,我尝试比较每个索引处每个列表的项目。

   ArrayList<List<String>> temp = new ArrayList<List<String>>();

//...

//...

        for(int i=0; i<temp.size()-1; i++) {

            for(int j=0; j<temp.get(i).size(); j++) {

                

                

                int min = Integer.valueOf(temp.get(i+1).get(j));

                if(Integer.valueOf(temp.get(i).get(j)) < min) {

                    min = Integer.valueOf(temp.get(i).get(j));

                }else if(Integer.valueOf(temp.get(i).get(j)) >=min) {

                    temp.get(i).remove(j);

                }

            }

但该方法似乎不是最好的方法。你有什么想法吗?


婷婷同学_
浏览 133回答 3
3回答

元芳怎么了

这是使用 Java Streams 的另一种方法:List<Integer> list1 = Arrays.asList(3, 8, 15, 98);List<Integer> list2 = Arrays.asList(3, 4, 21, 98);List<Integer> list3 = Arrays.asList(5, 4, 76, 90);Optional<List<Integer>> result = Stream.of(list1, list2, list3)    .sorted((a, b) -> IntStream.range(0, a.size())        .map(i -> Integer.compare(a.get(i), b.get(i)))        .filter(i -> i != 0)        .findFirst()        .orElse(0))    .findFirst();System.out.println(result);这就是它的工作原理。我们对列表进行流式传输,使用某个特定值对流进行排序Comparator,然后找到第一个出现的位置。它返回一个Optional,以防Optional.empty()您不提供任何列表,因此自然不存在“最小”。排序函数执行以下操作。它遍历列表的所有索引,并将两个列表中该位置的元素相互比较。它继续行走,直到比较返回非零值。这意味着该位置的元素不同。如果所有位置的比较都返回 0,则意味着列表之间没有区别(前提是所有列表的长度都相等)。如果你想处理长度不等的列表,你可以相应地重写排序函数。它遍历两个列表中有效的所有索引。如果所有元素都相等,则选择最短的列表。(a, b) -> IntStream.range(0, Math.min(a.size(), b.size()))    .map(i -> Integer.compare(a.get(i), b.get(i)))    .filter(i -> i != 0)    .findFirst()    .orElse(Integer.compare(a.size(), b.size()))

大话西游666

任何比较算法都可以使用 Java 比较器轻松编写。但首先让我们假设您正在比较整数列表而不是字符串列表,因为这就是您正在做的。如果您的原始数据以字符串格式呈现,那么显然您必须将数据转换为数字类型,以便将它们作为数字进行比较。您可以拥有一个 TreeSet,它可以通过使用自定义比较算法来保留其元素的顺序。您可以编写一个可以通过多个对象属性进行比较的比较器。当假设您想按名字和第二个名字(按第 1 列,然后按第 2 列)比较员工列表时,这很有用。在我们的例子中,我们可以通过第一个索引进行比较,然后通过第二个索引进行比较,然后通过第三个索引进行比较,并且该链可以根据需要深入到您的列表中。public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; List<Integer> list1 = Arrays.asList(3,8,15,98);&nbsp; &nbsp; &nbsp; &nbsp; List<Integer> list2 = Arrays.asList(3,4,21,98);&nbsp; &nbsp; &nbsp; &nbsp; List<Integer> list3 = Arrays.asList(5,4,76,90);&nbsp; &nbsp; &nbsp; &nbsp; int comparisonLength = 4;&nbsp; &nbsp; &nbsp; &nbsp; Comparator<List<Integer>> comparator = Comparator.comparing(list -> list.get(0));&nbsp; &nbsp; &nbsp; &nbsp; for(int i = 1; i< comparisonLength; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final int comparedIndex = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comparator = comparator.thenComparing(list -> list.get(comparedIndex));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; TreeSet<List<Integer>> treeSet = new TreeSet<>(comparator);&nbsp; &nbsp; &nbsp; &nbsp; treeSet.add(list1);&nbsp; &nbsp; &nbsp; &nbsp; treeSet.add(list2);&nbsp; &nbsp; &nbsp; &nbsp; treeSet.add(list3);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(treeSet.iterator().next()); //prints the first element in the collection&nbsp; &nbsp; }

弑天下

public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; List<String> l1 = Arrays.asList("3", "8", "15", "98");&nbsp; &nbsp; &nbsp; &nbsp; List<String> l2 = Arrays.asList("3", "4", "21", "98");&nbsp; &nbsp; &nbsp; &nbsp; List<String> l3 = Arrays.asList("5", "4", "76", "90");&nbsp; &nbsp; &nbsp; &nbsp; ArrayList<List<String>> list = (ArrayList<List<String>>) Stream.of(l1, l2, l3).collect(Collectors.toList());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .min(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (a, b) -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < Math.min(a.size(), b.size()); i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!a.get(i).equals(b.get(i))) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Integer.parseInt(a.get(i)) - Integer.parseInt(b.get(i));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ).orElseThrow(RuntimeException::new)&nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答