我使用以下代码遍历一个arraylist数组:
for(List<Long> innerList : arr) {
for(Long number : innerList) {
System.out.println(number);
}
}
此代码返回arraylist的每个数组中的数字。我想比较arraylist的第一个数组的第一个元素与arraylist的所有其他数组的所有其他元素。怎么做?
完成计划:
static long getWays(long sum, long[] changes) {
int count=0;
ArrayList<ArrayList<Long>> arr = new ArrayList<ArrayList<Long>>();
for(int i=0;i<changes.length;i++){
ArrayList<Long> arr1 = new ArrayList<Long>();
long change = changes[i];
long value = changes[i];
arr1.add(change);
for(int j=0;j<sum;j++){
change = change + value;
if(change>sum){
break;
}
arr1.add(change);
}
arr.add(arr1);
}
for(List<Long> innerList : arr) {
for(Long number : innerList) {
System.out.println(number);
}
}
return count;
}
答案 0 :(得分:1)
textView
您可以将第一个元素保留在var。
中答案 1 :(得分:1)
我会选择Stream.flatMap
。
返回一个流,该流包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。
flatMap()操作具有将一对多转换应用于流的元素,然后将生成的元素展平为新流的效果。
data.stream() //stream a list of list
.flatMap( List::stream ) //stream each list
// At this point, we have a Stream reading every `Long` values in those Collections
.filter(l -> l.equals(value)) //filter only the equivalent value
.count() - 1; //-1 to remove the first one
这将为您提供第一个值的出现次数:
final Long value = data.get(0).get(0);
示例:
List<List<Long>> data = new ArrayList<List<Long>>();
for(int i = 0; i < 5; ++i){
data.add(new ArrayList<>());
for(int j = 0; j < 10; ++j){
data.get(i).add(1L * i * j);
}
}
final Long value = data.get(0).get(0);
long count = data.stream()
.flatMap( List::stream )
.filter(l -> l.equals(value))
.count() - 1;
System.out.println(count);
13
你不清楚比较你这样做我让你适应filter
。我只是在这里计算第一个值的出现次数。
请注意,您仍然需要进行一些验证以防止异常(检查列表是否为空,如果列表中有List
只有一个Long
...