我需要在ArrayList
队列中添加元素,但是当我调用函数添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引)并且如果数组有10个元素添加删除最旧元素(索引最高的元素)的新结果.
有没有人有什么建议?
我试图理解为什么Java的ArrayDeque优于Java的LinkedList,因为它们都实现了Deque接口.
我几乎没有看到有人在他们的代码中使用ArrayDeque.如果有人对ArrayDeque的实现方式有了更多了解,那将会很有帮助.
如果我明白了,我会更有信心使用它.我无法清楚地了解JDK实现它管理头尾引用的方式.
如何在以下代码中获取流或列表的最后一个元素?
哪里data.careas
是List<CArea>
:
CArea first = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal).findFirst().get();
CArea last = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.collect(Collectors.toList()).; //how to?
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,获得第一个元素filter
并不难.
然而,获得单行中的最后一个元素是一个真正的痛苦:
Stream
.(它只对有限流有意义)first()
和last()
从List
接口,这实在是一种痛苦.我没有看到任何关于不在接口中提供first()
和last()
方法的论据List
,因为其中的元素是有序的,而且大小是已知的.
但根据原始答案:如何获得有限的最后一个元素Stream
?
就个人而言,这是我能得到的最接近的:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Run Code Online (Sandbox Code Playgroud)
然而,它确实涉及使用indexOf
每个元素,这很可能不是您通常想要的,因为它可能会影响性能.
是否有一种理智的方式从列表中获取有序流(具体来说,数组列表,但它应该无关紧要)流式元素与它们在原始列表中的方式相反?
我正在寻找一种不涉及缓冲数据的解决方案(收集器,另一个列表,数组等,因为它们复制了浪费的容器),或者使用Collections.reverse
(因为它修改了列表).
到目前为止,我在这里看到的最干净的方法之一是实现我自己的版本的Spliterator
这ORDERED
和在列表中反向前进,或实施Iterator
反向迭代是,并使用Spliterators.spliteratorUnknownSize(iterator,ORDERED)
它.
注意这个问题不同于Java 8流逆序:其他问题询问如何反转流(一般情况下这是不可能的),并且答案提供了以某种方式反转源(我不想这样做),然后传输反向源.逆转源的成本是O(N),如果可能的话我想完全避免它.
我有一个Queue<Integer>
声明为Queue<Integer> queue=new LinkedList();
,我需要反转其中的元素顺序,然后将其转换为int数组.我在下面写了代码:
Collections.reverse((List)queue);
int[] res=queue.stream().mapToInt(Integer::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)
此代码有两个问题:
(List)queue
;那么我们有更优雅的方式来做到这一点吗?
澄清问题:
队列是否反转并不重要.我需要的是反转元素的int数组.
我想反向排序下面的流,但得到编译时错误"The method sorted() in the type IntStream is not applicable for the arguments ((<no type> o1, <no type> o2) -> {})"
.谁能纠正这个
IntStream.range(1, 100)
.filter(x -> x%2 != 0)
.sorted((o1,o2) -> -o1.compareTo(o2))
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud) 我正在尝试替换该ZonedDateTime.toInstant
方法,因为它仅在适用于 Android 的 API 26 之后可用。
但是我的应用程序应该支持 API 19。
我想将 ZonedDateTime 转换为 Date 以便我可以执行以下操作:
final Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
final long millis = calendar.getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)
我想实现如下:
我想计算当前日期和另一个日期之间的差异,以秒、分钟、小时为单位,......最高可能的单位获胜,所以我会得到例如5 days ago
结果。
例如,
Instream.range(0,10)
- 是从 0 索引迭代到 10。
Instream.range(10,0)
- 但是从 10 到 0 不起作用,如何使用 Stream API 做到这一点?
LinkedList可以使用升序或降序迭代器迭代,如下所示:
LinkedList<Object> list = new LinkedList<Object>();
...
StringJoiner sJ1 = new StringJoiner(" ");
list.iterator().forEachRemaining(a -> sJ1.add(a.toString()));
System.out.println("averse: \n" + sJ1.toString());
StringJoiner sJ2 = new StringJoiner(" ");
list.descendingIterator().forEachRemaining(a -> sJ2.add(a.toString()));
System.out.println("reverse: \n" + sJ2.toString());
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)averse: Hello 2 Chocolate 10 reverse: 10 Chocolate 2 Hello
但是descendingIterator不适用于List和ArrayList.有没有在列表说明任何解决办法,或者为什么的descendingIterator缺席的名单?
问题类似于可以为java中的每个循环以相反的顺序执行吗?.但所有答案都建议使用临时解决方案或第三方库.
可能有使用溪流可能吗?(不幸的是,我的谷歌搜索只给出了流Java 8流逆序的缺失标准反转)
正如我所提到的,我的问题与关于流的问题有关,但是:
我想知道在List实现中是否存在某种类型的reverse_iterator(如c ++)ArrayList<Integer>
.即,我想从列表的末尾而不是从头开始迭代?
有没有Java8流解决方案?
java ×10
java-8 ×5
java-stream ×4
arraylist ×2
collections ×2
linked-list ×2
android ×1
arraydeque ×1
arrays ×1
date ×1
deque ×1
list ×1
queue ×1
sorting ×1
stack ×1