一个很简单的问题,不过今天被问到了,一下子也说不出应该调用哪个方法,想想挺好玩:有一个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共存的代码。
SpringBoot + SpringData Jpa + Scala + Mysql(java+Scala混编)
功能:实现google的PageRank算法,带完整的测试数据和结果,java、scala语言版本 ********************************************************* 版本: scala2.10.4 spark 1.6.1 Scala IDE Build id: 4.4.1-vfinal...
Java 和 Scala 并发性基础
本资源提供了一套基于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 ...
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 ...
本项目是一个基于Java和Scala语言开发的Spark基础教程配套源码,包含55个文件,主要文件类型包括Java源代码、Scala源代码、XML配置文件、日志文件、Git忽略文件、LICENSE文件和Idea配置文件。系统设计旨在为学习...
基于SpringBoot/WebFlux+Shiro+JPA+Java/Scala,实现的数据库细粒度动态权限管理系统(源码),项目经过严格测试,确保可以运行! 环境 SpringBoot 2.0.3.RELEASE SpringBoot WebFlux SpringBoot Data Jpa Apache ...
1、资源内容:java电商大数据项目-推荐系统(java和scala语言) 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为java实战项目,课程设计,毕业设计“参考资料”参考学习使用。 3、解压说明:本资源需要...
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中均已实现。 指示 Java 只需使用javac命令编译源代码。 使用java命令运行字节码。 Scala 使用sbt进行项目建设。 直接编译文件的scalac可能不起作用。 该代码库使用支持scala...
主要介绍了Java 和 Scala 如何调用变参,帮助大家更好的理解和学习Java与Scala,感兴趣的朋友可以了解下
JAVA+Scala语言开发基于机器学习的商品类目预测源码+文档说明.zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,...
scala-js-java-time, 在JDK8中,java.time的Scala.js 实现 scalajs-java-time scalajs-java-time 是用于的java.time API的bsd许可 reimplementation,它支持在 Scala.js 项目中使用这里 API 。用法只需将以
Scala到Java 用Scala编写的简单工具,揭示了Scala编译器的奥秘。 从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 ...
面向Java开发人员的Scala指南 面向Java开发人员的Scala指南
用Scala和Java实现WordCount,其中Java实现的JavaWordCount是spark自带的例子($SPARK_HOME/examples/src/main/java/org/apache/spark/examples/JavaWordCount.java)OS:RedHatEnterpriseLinuxServerrelease6.4...