我正在比较ArrayList
和LinkedList
。
例如:
ArrayList => {2,4,5}
LinkedList => 1->3->8->7->6
Final Output => 1->2->3->4->5->8->7->6
我需要将数组列表中的元素与链表中的元素进行比较,并且需要插入,以便使用JAVA 8 Streams/Filter/Map/Collections...(我不知道)
不要改变已经存在的元素的顺序(在上面的例子中8->7->6没有改变顺序)
我尝试使用简单的Core java,通过使用两个for循环来比较并插入到链接列表中
for(int i=0;i<arrayList.size();i++){
for(int j=0;j<linkedList.size();j++){
if(linkedList.get(j)>arrayList.get(i)){
linkedList.add(j,arrayList.get(i));
break;
}
}
}
我需要使用流、映射、过滤器、集合等在 Java 8 中替换代码
最佳答案
您的任务中有一些奇怪的要求。首先,逻辑可以完全用列表来描述,不需要强制一个列表必须是ArrayList
,另一个列表必须是LinkedList
。
要求对任务使用 Stream API 也没什么用,尤其是对于不适合 Stream API 的任务。
如果 LinkedList
的目的是利用其在任意位置进行廉价插入的能力,那么这将更有意义。这个优势只有在使用迭代器时才能发挥出来,对于LinkedList
,所有基于索引的访问方法实际上都会降低性能。
这样的解决方案可能看起来像
// prerequisites
List<Integer> arrayList = new ArrayList<>(Arrays.asList(2,4,5));
List<Integer> linkedList = new LinkedList<>(Arrays.asList(1,3,8,7,6));
// changing linkedList
ListIterator<Integer> iterator = linkedList.listIterator();
for(Integer i: arrayList) {
while(iterator.hasNext()) {
if(iterator.next() > i) {
iterator.previous();
break;
}
}
iterator.add(i);
}
// 1->2->3->4->5->8->7->6
System.out.println(linkedList.stream()
.map(Object::toString).collect(Collectors.joining("->")));
这是针对 LinkedList
量身定制的,因为它可以避免在插入迭代器已链接的位置时多次迭代。
这个逻辑不能用 Stream API 来表达,至少在不违反它的一些规则的情况下是这样。阅读 Non-interference和 Stateless behaviors了解更多详情。
关于java - 通过使用 Java 8 将元素添加到链表中来比较数组列表和链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56571781/