`

根据依赖进行数据排序的示例

 
阅读更多

有个需求是进行多个js代码合并,js之间有互相依赖,依赖关系已经整理出,如

 

a depends on [b, d, e]

e depends on [c]

d depends on [c, e]

...

 

要做一个排序,一开始想,用个sort传个Comparator,比就可以了

ll.sort{a, b ->

// 没有任何依赖的排前面

if(!depends[a])

  return -1

if(!depends[b])

  return 1

 

if(depends[a].contains(b))

return 1

if(depends[b].contains(a))

return -1

 

return 0

}

结果发现根本不是这么回事儿

默认快速排序,排到前面的,不会再和后面的继续比较

 

所以就写了下面的这些代码

 

def ll = [a, b, c, d, e]
def depends = ...

def rll = []
// 不依赖其他的排到前面
rll.addAll(ll.grep{!depends[it]})
// 依赖非本次排序的模块的拍到前面
rll.addAll(ll.grep{
	def dLl = depends[it]
	dLl && dLl.every{one -> !ll.contains(one)}
})

// 最多循环次数,防止死循环
int loopCount = ll.size()
while(rll.size() != ll.size() && loopCount >= 0){
	rll.addAll(ll.grep{
		def dLl = depends[it].grep{one -> 
			ll.contains(one)
		}

		// 排除已经在结果队列的
		// 把依赖都已经在结果队列的排进入
		!rll.contains(it) && dLl && dLl.every{one -> rll.contains(one)}
	})
	loopCount--
}
return rll
 

 

分享到:
评论

相关推荐

    WPF依赖项属性示例

    项目中的类可能会创建自定义依赖项属性,并在UI元素上进行数据绑定、事件处理等操作。例如: - 一个自定义的按钮控件,注册了一个`BackgroundColor`依赖项属性,用于改变按钮背景色。 - 通过数据绑定,将`...

    R数据可视化手册 示例代码

    这本书涵盖了各种图表类型、数据处理和自定义图形的技巧,旨在帮助读者掌握数据故事的视觉呈现。"示例代码"这部分内容提供了书中每个章节的实践代码,使读者能够亲手操作,加深理解。 在R语言中,数据可视化主要...

    Sql缓存依赖示例

    Sql缓存依赖是一种技术,主要用于提高应用程序的性能和效率,特别是在处理大量数据时。它的工作原理是基于数据库查询结果的缓存,当数据库中的数据发生变化时,能够及时通知应用程序更新缓存,避免了不必要的数据库...

    《kettle中访问前一行数据》示例附件

    这个示例附件“stock”很可能是用来演示如何在实际数据处理场景中应用这些技巧,例如在股票数据分析中,我们可能需要根据历史价格或交易量来计算趋势或预测未来走势。通过深入学习和实践,你可以充分利用Kettle的...

    wpf 数据绑定编程示例

    4. **集合视图(ICollectionView)**:WPF提供了ICollectionView接口,它是数据源的一个视图,可以进行排序、过滤和分页操作。这使得用户界面可以根据数据的特定状态进行动态更新。 5. **MVVM模式**:在WPF中,通常...

    JSON Java:Json-lib+依赖包+示例

    2. `ezmorph-1.0.6.jar`:这是一个转换工具库,Json-lib依赖它来进行数据类型的转换,如将字符串转换为日期等。 3. `Json-lib JSON Java dependency依赖包.txt`:这可能是一个文本文件,列出了Json-lib所依赖的所有...

    Jquery dataTable后台获取数据示例

    6. **前端回调处理**: DataTables 在加载数据后,会触发`drawCallback`等回调函数,你可以在这里进行进一步的DOM操作或数据处理。 ### 案例分析 "checkdemo"可能是该项目的一个示例或测试模块,它可能包含了实现...

    GDAL2.2.3依赖包和Android项目读写shp文件示例代码

    在GIS(地理信息系统)开发中,处理空间数据时经常需要用到GDAL库,它是一个开源的地理空间数据处理库。GDAL支持多种矢量和栅格数据格式,包括ESRI Shapefile(简称shp文件),这是一种广泛使用的地理空间数据格式。...

    SpringBoot处理JSON数据示例代码

    本示例代码着重展示了如何在Spring Boot应用中处理JSON数据。 1. **依赖引入**: 在`pom.xml`文件中,我们需要添加Spring Web依赖,因为处理JSON功能是基于Spring Web提供的。以下是一个简单的依赖配置示例: ``...

    隐马尔可夫代码(附带数据示例)

    在给定的压缩包文件“24.HMM”中,包含了一些关于HMM实际应用的数据示例,特别是关于广义马尔可夫混合模型(Generalized Hidden Markov Model,简称GHMM)的实例。GHMM是HMM的扩展,允许状态空间的离散化程度不同,...

    模拟vue双向数据绑定示例

    Vue.js 是一款流行的前端JavaScript框架,它以组件化、易用性...通过这个示例,你可以进一步掌握JavaScript开发中使用Vue.js进行数据绑定和状态管理的技巧,这对于任何想要涉足前端开发的程序员来说都是非常有价值的。

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    无论是处理数据库记录、优化数据结构还是解决复杂问题,排序算法都是基础工具。在本文中,我们将深入探讨内部排序算法,包括它们的工作原理、优缺点以及如何使用Python、JavaScript、Java、Go和PHP这些编程语言来...

    数组应用及冒泡排序算法示例学习

    尽管冒泡排序效率不高,但对于小规模数据和部分有序的数据,它仍然是一种实用的排序方法,尤其适合教学和理解排序算法的基本原理。 在提供的"冒泡排序示例"文件中,很可能是包含了用不同编程语言实现冒泡排序的代码...

    Kettle插件开发官方示例

    Kettle,全称为Pentaho Data Integration...总之,"Kettle插件开发官方示例"是学习和实践Kettle插件开发的重要资源,通过深入研究和模仿这些示例,开发者可以提升自己的技能,更好地利用Kettle解决复杂的数据处理问题。

    Eclipse下使用Google Gson解析Json数据示例+Android Studio下使用Google Gson解析Json数据示例

    总结来说,无论是在Eclipse还是Android Studio,Google Gson库都是处理JSON数据的强大工具。通过简单易用的API,我们可以轻松地将JSON与Java对象相互转换,极大地提高了开发效率。在实际项目中,理解并熟练掌握Gson...

    依赖属性实现绑定

    在WPF(Windows Presentation Foundation)开发中,依赖属性(Dependency Property)是实现数据绑定的关键机制。...在实际开发中,根据需求自定义依赖属性并实现数据绑定,能够实现灵活且动态的数据驱动UI。

    pb数据窗口的通用排序

    在PB应用中,数据窗口经常被用于数据的展示和交互,而通用排序功能则是数据窗口的一个关键特性,允许用户根据特定需求对数据进行升序或降序排列。 1. **数据窗口的排序方式** - **内置排序**:PB数据窗口提供了...

    spark streamming消费kafka数据存入hbase示例代码

    首先,我们需要了解 Scala 语言,它是面向对象和函数式编程的结合,被广泛用于构建大规模数据处理应用。在 Spark 中,Scala 提供了简洁且高效的 API 来操作数据。 Spark Streaming 支持 DStream(Discretized ...

    spark2官方示例源代码

    Spark2官方示例源代码提供了丰富的实例,帮助开发者更好地理解和使用Spark进行数据处理任务。这些示例涵盖了多种常见的数据处理场景,如文本分析、数据库交互、Parquet文件操作以及JSON数据处理等。 一、WordCount ...

    mina客户端简单代码示例

    尽管这个示例可能省略了错误处理和其他复杂功能,但它展示了基本的连接和数据传输机制。 在创建Mina客户端时,通常需要以下步骤: 1. **导入依赖**:首先,确保在项目中包含了Apache Mina的库。这可以通过Maven或...

Global site tag (gtag.js) - Google Analytics