在arraylist的数组中,获取最大的arraylist

问题描述 投票:0回答:4

我有一个包含多个不同大小的数组列表的数组。

我想找到数组中最大的数组列表的索引。我试过这个:

Collections.max(disc);

disc 是数组列表数组的名称。

ArrayList 我相信没有实现 Comparable 接口,所以我不能这样做。有没有办法让自定义的 ArrayList 大小具有可比性?

java arrays arraylist
4个回答
2
投票

如果您想知道最大子 ArrayList 的索引,那么您基本上是在寻找与最大

ArrayList
存储位置相关的信息。这项研究不仅基于您最大的
ArrayList
的内在特征,还基于它所在的位置。

使用

Collections.max()
对您没有帮助,即使您重新定义其自然顺序并提供新的
Comparator
,因为您只会获得最大的
ArrayList
,而不是存储它的索引。如果你想找到索引,你必须手动循环外部
ArrayList
,每当你找到一个新的最大子ArrayList时,保存它的索引。

当然,我所说的唯一条件是您对检索索引感兴趣,而不是最大的子ArrayList本身。如果您只是寻找最大的子 ArrayList,那么您需要的是具有

Collections.max()
实现的
Comparator


2
投票

您无法向现有类添加接口。如果您希望

ArrayList
实现
Comparable
,您需要编写一个包含
ArrayList
并实现该接口的适配器类。

但是,就您而言,您不需要那个。

Comparable
有一个名为
Comparator
的姊妹接口,它是一个外部对象,指定如何比较某种类型。它可用于提供替代排序机制(例如,降序而不是升序),或者,如您的情况,为缺少比较功能的现有类添加比较功能。并且
Collections.max
具有需要比较器的 过载

Collections.max(disc, (a, b) -> a.size() - b.size())

请注意,如果您使用的是非常旧的 Java 版本,则需要显式创建一个

Comparator
实例,而不是像我上面那样使用 SAM 转换


2
投票

我想找到数组中最大的arraylist的索引。

Collections.max
不接受
array
也不返回
index
。它返回
Collection
中的大元素。

在不知道你的确切数据结构的情况下,我正在使用列表的列表。

List<List<Integer>> ss = 
    List.of(
        List.of(1, 2, 3),
        List.of(1, 2, 3, 4), 
        List.of(1, 2)
    );

这只是比较大小并返回针对最大列表的索引

int maxIndex = IntStream.range(0, ss.size()).boxed().collect(Collectors
            .maxBy(Comparator.comparing(i -> ss.get(i).size()))).get();

打印

1

maxBy
收集器返回一个
Optional
,我立即获取了其中的值。您可能希望将其分配给可选的,然后对空集合进行适当的处理。

更简单的方法是使用循环。 只需找到最大大小并将索引与其关联即可。

maxIndex = 0;
int maxSize = 0;
for (int i = 0; i < ss.size(); i++) {
    int size = ss.get(i).size();
    if (size> maxSize) {
        maxIndex = i;
        maxSize = size;
    }
}
System.out.println(maxIndex);

打印

1

1
投票

我更喜欢 WJS 的更聪明的解决方案,但这里还有另一个解决方案。这里的内容并不那么简短,但第一次阅读时可能更容易理解。

你说:

我有一个包含多个不同大小的数组列表的数组。我想找到数组中最大的数组列表的索引。

正如他们所讨论的,

Collections.max
返回对最大对象的引用,而不是该对象在数组中的索引。

所以我们需要两个步骤:

  1. 确定最大元素。
  2. 获取最大对象的索引。

首先,一些示例数据。

List[] arrayOfListsOfIntegers =
        List.of(
                        List.of( 1 ) ,
                        List.of( 1001 , 1002 , 1003 , 1004 ) ,
                        List.of( 101 , 102 , 103 ) ,
                        List.of( 11 , 12 )
                )
                .toArray( List[] :: new );

确定最大元素

使用

Arrays.asList
来查看显示为
List
的阵列。这样我们就可以调用方便的
List
方法。

然后创建该列表的流。通过获取每个元素的大小对流中的元素进行排序。从已排序的元素创建一个新列表。我们知道排序列表的最后一个元素具有最大的元素。

List sorted =
        Arrays
                .asList( arrayOfListsOfIntegers )
                .stream()
                .sorted( Comparator.comparingInt( List :: size ) )
                .toList();

获取对最大元素的引用,即我们排序列表中的最后一个元素。

Object target = sorted.get( sorted.size() - 1 );

获取最大对象的索引

该目标对象是我们想要在原始列表中定位的对象。我们可以通过拨打

List#indexOf
来定位。在这里,我们再次使用
Arrays.asList
将数组屏蔽为
List

int index = Arrays.asList( arrayOfListsOfIntegers ).indexOf( target );
© www.soinside.com 2019 - 2024. All rights reserved.