一个很简单的问题,不过今天被问到了,一下子也说不出应该调用哪个方法,想想挺好玩:有一个linkedlist,现在要对它做遍历,对遍历到的每一个元素A,需要对从A到尾节点的所有元素再进行一次遍历,完成一个嵌套循环
最直接的方式就是:
int index = 0;
for (Iterator<Integer> i = list.iterator(); i.hasNext();) {
Integer num = i.next();
index++;
boolean startLoopWork = false;
int innerIndex = 0;
for(Iterator<Integer> j = list.iterator(); i.hasNext();) {
Integer num2 = j.next();
innerIndex++;
startLoopWork = startLoopWork || index == innerIndex-1;
if (startLoopWork) {
// do something
System.out.println(num + ":" + num2);
}
}
}
虽然直接,但是意图表达的不是很直接,那么在内层就直接对sublist进行遍历吧:
int anotherIndex = 0;
for (Iterator<Integer> i = list.iterator(); i.hasNext();anotherIndex++) {
Integer num = i.next();
if (anotherIndex >= list.size()) break;
List<Integer> subList = list.subList(anotherIndex+1, list.size());
for(Iterator<Integer> j = subList.iterator(); j.hasNext();) {
Integer num2 = j.next();
// do something
System.out.println(num + ":" + num2);
}
}
这个实际上也就是list.listIterator(index)做的事情,恩,list已经有这样的一个接口了:
for (ListIterator<Integer> i = list.listIterator(); i.hasNext();) {
Integer num = i.next();
for (Iterator<Integer> innerIterator = list.listIterator(i.nextIndex()); innerIterator.hasNext();) {
Integer innerNum = innerIterator.next();
// do something
System.out.println(num + ":" + innerNum);
}
}
这样的实现下,innerIterator是一个O(n)算法,不过由于链表中的元素是private的Entry对象,对外不可见,所以...我觉得这个限制使得扩展性不够好,不知道有什么特别考虑么?望知道的朋友告知
最后看一个scala的实现,scala中对链表统一抽象成head::rest:
@tailrec
def doubleIterate[A](list: List[A])(f: (A, Option[A]) => Unit): Unit = {
list match {
case (head :: Nil) => f(head, None)
case (head :: rest) =>
rest.foreach (each => f(head, Some(each)))
doubleIterate(rest)(f)
}
}
借助了scala的模式匹配机制,虽然写起来一样的繁琐,但是意图表达的比较清楚
这个实现的问题是只能应用于链表,而无法应用到其他的可以迭代的结构,比如array,string等,不过scala中并没有提供像java这样直接的api,所以为了能对所有具有iterable特性的数据结构进行这样的操作,还是只能回到原始的做法:
def doubleIterateIterable[A](iterable: Iterable[A])(f: (A, A) => Unit) = {
var index = 0
iterable.foreach { i =>
index = index + 1
iterable.iterator.drop(index).foreach(j => f(i, j))
}
}
这里,间接性主要来自于闭包,不过scala的iterable特性没有提供foreachWithIndex这样的方法。话说java中应该也有类似drop的接口吧。
分享到:
相关推荐
基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于...
本篇将详细探讨如何在Maven构建工具中实现Java和Scala的混合编译。 首先,我们需要理解Maven的核心概念。Maven是一个项目管理工具,它通过使用约定优于配置的原则来简化构建过程。它依赖于`pom.xml`配置文件,该...
在Java项目中使用Scala,通常被称为Java和Scala的混编。这种混编允许开发团队在已有的Java项目中逐渐引入Scala代码,以利用其优势,同时保持与现有Java代码的兼容性。在实际应用中,可能会在服务端逻辑或者特定组件...
功能:实现google的PageRank算法,带完整的测试数据和结果,java、scala语言版本 ********************************************************* 版本: scala2.10.4 spark 1.6.1 Scala IDE Build id: 4.4.1-vfinal...
该项目是一款名为DAF4J的Java与Scala混合编写的...项目总文件量为135个,其中包含112个Java源文件、11个Scala源文件、4个XML配置文件、3个Markdown文件、2个文本文件、1个Git忽略文件、1个许可证文件和1个属性文件。
Java 和 Scala 并发性基础
该系统是一款基于Java和Scala语言开发的深圳地铁大数据客流分析系统源码,总计包含106个文件,其中包括40个Java源文件、20个Scala源文件、35个PNG图片文件、4个XML配置文件、1个7z压缩文件、1个gitignore文件、1个...
本资源提供了一套基于Java、Scala和Spark的数据处理与分析设计源码,包含1381个文件,其中包括634个CRC文件,316个BK文件,35个Class字节码文件,20个XML配置文件,15个Java源代码文件,13个JAR打包文件,8个...
Scala 函数嵌套我们可以在 Scala 函数内定义函数,定义在函数内的函数称之为局部函数。
基于java+scala+Python+spark实现的图书推荐系统的设计与实现+详细文档+全部资料(高分毕业设计).zip基于java+scala+Python+spark实现的图书推荐系统的设计与实现+详细文档+全部资料(高分毕业设计).zip ...
Java电商大数据项目-推荐系统(java和scala语言) Bump spark.version from 2.1.0 to 2.4.7 in /MySparkProject dependencies #6 by dependabot bot was merged 4 minutes ago Bump junit from 3.8.1 to 4.13.1 in /...
在本项目"电商大数据项目-推荐系统(java和scala语言).zip"中,主要涉及的是电商领域的大数据处理和推荐系统的构建。项目采用两种主流的编程语言——Java和Scala,这表明我们将深入理解这两种语言在大数据处理中的...
首先,要实现Java和Scala的互调用,我们需要在`pom.xml`文件中配置Maven。确保`maven-compiler-plugin`和`scala-maven-plugin`已添加并正确配置。`maven-compiler-plugin`用于编译Java源代码,而`scala-maven-plugin...
Master the fundamentals of Scala and understand its emphasis on functional programming that sets it apart from Java. This book will help you translate what you already know in Java to Scala to start ...
标题中的“Scala Java相关开发工具”表明我们讨论的是与Java和Scala编程语言相关的开发环境和工具。Java和Scala都是在JVM(Java虚拟机)上运行的语言,它们有着紧密的联系,但各自拥有独特的特性和用途。 首先,...
读书笔记:用java模拟scala函数式编程模拟实现mapreduce
本项目是一个基于Java和Scala语言开发的Spark基础教程配套源码,包含55个文件,主要文件类型包括Java源代码、Scala源代码、XML配置文件、日志文件、Git忽略文件、LICENSE文件和Idea配置文件。系统设计旨在为学习...
1、资源内容:java电商大数据项目-推荐系统(java和scala语言) 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为java实战项目,课程设计,毕业设计“参考资料”参考学习使用。 3、解压说明:本资源需要...
《面向Java开发人员的Scala指南》是一本专为熟悉Java编程语言的开发者设计的书籍,旨在帮助他们理解和掌握Scala这门强大的多范式编程语言。Scala结合了面向对象和函数式编程的特点,提供了更高的代码抽象能力和性能...
基于SpringBoot/WebFlux+Shiro+JPA+Java/Scala,实现的数据库细粒度动态权限管理系统(源码),项目经过严格测试,确保可以运行! 环境 SpringBoot 2.0.3.RELEASE SpringBoot WebFlux SpringBoot Data Jpa Apache ...