我有一个包含多个不同大小的数组列表的数组。
我想找到数组中最大的数组列表的索引。我试过这个:
Collections.max(disc);
disc 是数组列表数组的名称。
ArrayList 我相信没有实现 Comparable 接口,所以我不能这样做。有没有办法让自定义的 ArrayList 大小具有可比性?
如果您想知道最大子 ArrayList 的索引,那么您基本上是在寻找与最大
ArrayList
存储位置相关的信息。这项研究不仅基于您最大的 ArrayList
的内在特征,还基于它所在的位置。
使用
Collections.max()
对您没有帮助,即使您重新定义其自然顺序并提供新的 Comparator
,因为您只会获得最大的 ArrayList
,而不是存储它的索引。如果你想找到索引,你必须手动循环外部ArrayList
,每当你找到一个新的最大子ArrayList时,保存它的索引。
当然,我所说的唯一条件是您对检索索引感兴趣,而不是最大的子ArrayList本身。如果您只是寻找最大的子 ArrayList,那么您需要的是具有
Collections.max()
实现的 Comparator
。
您无法向现有类添加接口。如果您希望
ArrayList
实现 Comparable
,您需要编写一个包含 ArrayList
并实现该接口的适配器类。
但是,就您而言,您不需要那个。
Comparable
有一个名为 Comparator
的姊妹接口,它是一个外部对象,指定如何比较某种类型。它可用于提供替代排序机制(例如,降序而不是升序),或者,如您的情况,为缺少比较功能的现有类添加比较功能。并且 Collections.max
具有需要比较器的 过载。
Collections.max(disc, (a, b) -> a.size() - b.size())
请注意,如果您使用的是非常旧的 Java 版本,则需要显式创建一个
Comparator
实例,而不是像我上面那样使用 SAM 转换。
我想找到数组中最大的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
我更喜欢 WJS 的更聪明的解决方案,但这里还有另一个解决方案。这里的内容并不那么简短,但第一次阅读时可能更容易理解。
你说:
我有一个包含多个不同大小的数组列表的数组。我想找到数组中最大的数组列表的索引。
正如他们所讨论的,
Collections.max
返回对最大对象的引用,而不是该对象在数组中的索引。
所以我们需要两个步骤:
首先,一些示例数据。
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 );