java 排序api_用java api进行sort

Sun授权刊登

本节中所描述的多态算法 (polymorphic algorithms)是由 JDK 所提供的可重复使用的功能性片段。它们均取自Collections类,并都采用静态方法(它的第一个参数是执行操作的 对象集)的形式。由Java平台所提供的绝大多数算法都操作于List对象,但有两个 (min 和 max) 操作于任意Collection对象。以下是关于算法的描述

排序(Sorting)

排序算法可为一个 List 重新排序,以使它的元素按照某种排序关系成上升式排序。有两种形式的操作被提供。简单形式的操作只采用一个 List 并按照它的元素的自然排序进行排序。如果你对自然排序的概念不熟悉,那么应该重新阅读 对象排序(Object Ordering).

sort 操作使用做了些优化的合并排序(merge sort) 算法。如果你不知道它的含义,而又很看重它的话, 请阅读关于算法的任意一种教科书。这个算法的重要之处是:

快速: 这个算法被保证运行在 n log(n) 时间内,并在已基本排序的列表上,它的速度实质上更快。经验表明,它的速度与高度优化的快速排序(quicksort)的速度差不多, Quicksort 一般被认为快于合并排序,但它不稳定,并不保证 n log(n)性能。

稳定: 这就是说,它不为相等的元素重新排序。如果你为相同的列表做不同属性的重复排序,这一点对你来说是十分重要的。如果一个邮件程序的用户为它的邮件箱按日期排序,然后又按发件人排序,这个用户自然地期望某个特定发件人的现在相邻的消息列表将(仍然)按日期排序。这一点只有在第二个排序是稳定的时候才能得以保证。

以下是 一个小程序,它可按词典(字母)顺序打印它的参数:

import java.util.*;

public class Sort {

public static void main(String args[]) {

List l = Arrays.asList(args);

Collections.sort(l);

System.out.println(l);

}

}

让我们运行这个程序:

% java Sort i walk the line

[i, line, the, walk]

演示这个程序只是为了表示我是毫无保留的:这个算法确实是象它们所显现的那样简单。我不想低估你的能力而演示更傻的例子。

第二种形式的 sort除采用一个 List 外,还采用一个 Comparator 并且使用 Comparator 对元素进行排序。还记得在 Map 课程结束时的排列组的例子吗? 它以一个非特定的顺序打印出排列组。假设你要以相反的大小顺序打印它们,大的排列在前面。下列例子将告诉你如何借助 sort 方法的第二种形式而达到你的目的。

回想一下,排序表是以 List 对象的形式作为一个 Map 中的值而被存储的。修改后的打印代码通过 Map 的 values视图进行迭代, 将每一个通过最小尺寸测试的List放进List 之中。然后,代码使用一个期望 List 对象的 Comparator 为这个 List 排序,并实现反转大小排序。最终,代码通过现在已排序的 List 进行迭代,打印它的元素(排序组)。这个代码在 Perm 的 main 方法末尾替代了打印代码:

// Make a List of all permutation groups above size threshold

List winners = new ArrayList();

for (Iterator i = m.values().iterator(); i.hasNext(); ) {

List l = (List) i.next();

if (l.size() = minGroupSize)

winners.add(l);

}

// Sort permutation groups according to size

Collections.sort(winners, new Comparator() {

public int compare(Object o1, Object o2) {

return ((List)o2).size() - ((List)o1).size();

}

});

// Print permutation groups

for (Iterator i=winners.iterator(); i.hasNext(); ) {

List l = (List) i.next();

System.out.println(l.size() + ": " + l);

}

用与 Map 课程中使用的相同的词典运行 这个程序 ,并使用相同的最小排序组尺寸(8),会产生下列输出:

% java Perm dictionary.txt 8

12: [apers, apres, asper, pares, parse, pears, prase, presa, rapes,

reaps, spare, spear]

11: [alerts, alters, artels, estral, laster, ratels, salter, slater,

staler, stelar, talers]

10: [least, setal, slate, stale, steal, stela, taels, tales, teals,

tesla]

9: [estrin, inerts, insert, inters, niters, nitres, sinter, triens,

trines]

9: [capers, crapes, escarp, pacers, parsec, recaps, scrape, secpar,

spacer]

9: [anestri, antsier, nastier, ratines, retains, retinas, retsina,

stainer, stearin]

9: [palest, palets, pastel, petals, plates, pleats, septal, staple,

tepals]

8: [carets, cartes, caster, caters, crates, reacts, recast, traces]

8: [ates, east, eats, etas, sate, seat, seta, teas]

8: [arles, earls, lares, laser, lears, rales, reals, seral]

8: [lapse, leaps, pales, peals, pleas, salep, sepal, spale]

8: [aspers, parses, passer, prases, repass, spares, sparse, spears]

8: [earings, erasing, gainers, reagins, regains, reginas, searing,

seringa]

8: [enters, nester, renest, rentes, resent, tenser, ternes, treens]

8: [peris, piers, pries, prise, ripes, speir, spier, spire]

上一页 1 2 3 下一页

a

混排(Shuffling)

混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的游戏中是非常有用的。例如,它可被用来混排代表一副牌的 Card 对象的一个 List 。另外,在生成测试案例时,它也是十分有用的。

这个操作有两种形式。第一种只采用一个 List 并使用默认随机源。第二种要求调用者提供一个 Random 对象作为随机源。这个算法的一些实际代码曾在 List 课程中被作为例子使用。

常规数据操作(Routine Data Manipulation)

Collections 类为在 List 对象上的常规数据操作提供了三种算法。这些算法是十分简单明了的:

reverse: 反转在一个列表中的元素的顺序。

fill: 用特定值覆盖在一个 List 中的每一个元素。这个操作对初始化一个 List 是十分有用的。

copy: 用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List 至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。

搜索(Searching)

binary search (二进制搜索)算法用二进制搜索算法在一个已排序的 List 中寻找特定元素。这个算法有两种形式。第一种采用一个 List 和一个要寻找的元素 ( "搜索键(search key)")。这种形式假设 List 是按照它的元素的自然排序排列成上升顺序的。第二种形式除采用 List 外,还采用一个 Comparator 以及搜索键,并假设 List 是按照特定 Comparator 排列成上升顺序的。 排序算法(描述见上) 可优先于 binarySearch 而被用来为List 排序。

两种形式的返回值是相同的: 如果 List 包含搜索键,它的索引将被返回;如果不包括,则返回值为 (-(insertion point) - 1), 这里的 insertion point 被定义为一个点,从这个点该值将被插入到这个 List 中:大于该值的第一个元素的位置索引,或list.size()。 选用这个不可否认的难看的公式是为了保证如果且仅如果搜索键被发现,则返回值将等于0。它基本上是一个将布尔逻辑 ("found") 和整数 ("index") 综合到单一的int返回值的大杂烩。

下列惯用程序对 binarySearch 操作的两种形式均适用,它寻找特定搜索键,如果搜索键不出现,则将它插入到适当的位置:

int pos = Collections.binarySearch(l, key);

if (pos < 0)

l.add(-pos-1, key);

寻找极值(Finding Extreme Values)

min 和 max 算法分别返回包含在特定 Collection 中的最小和最大元素。这两个操作都各有两种形式,简单形式只采用一个 Collection, 并按照元素的自然排序返回最小 (或最大) 元素;另一种形式除采用 Collection 之外,还采用一个 Comparator,并按照特定 Comparator返回最小(或最大)元素。

这些就是由Java 平台提供的作用于与 List 对象相对的任意 Collection 对象上的仅有算法,就象上面提到的 fill 算法一样,这些算法都是非常简单明了的,它们是Java平台为程序员特别提供的便利工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java判断正整数正则_Java正则验证正整数的方法分析【测试可用】

本文实例讲述了Java正则验证正整数的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;package des;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Num {/*** param args*/public static void main(String[] args) {// TODO Auto-ge…

java上溯造型_think-in-java/6.7 上溯造型.md at master · quanke/think-in-java · GitHub

6.7 上溯造型继承最值得注意的地方就是它没有为新类提供方法。继承是对新类和基础类之间的关系的一种表达。可这样总结该关系&#xff1a;“新类属于现有类的一种类型”。这种表达并不仅仅是对继承的一种形象化解释&#xff0c;继承是直接由语言提供支持的。作为一个例子&#…

java 官网下载jdk源码_openJDK之如何下载各个版本的openJDK源码

如果我们需要阅读openJDK的源码&#xff0c;那么需要下载&#xff0c;那么该去哪下载呢?现在JDK已经发展到版本10了&#xff0c;11已经处于计划中&#xff0c;如果需要特定版本的openJDK&#xff0c;它们的下载链接在哪呢?1.openJDK的项目图1 可以看到有openJDK6、openJDK7、…

java 这么获取农历_用JAVA查询中国农历年

用来查询农历年的代码&#xff0c;可能比较粗糙&#xff0c;希望不要太打击偶&#xff0c;哈哈。一&#xff0c;Console.java[用来获取控制台的输入]/*#()Console.java 20:40:25 2/2/2006控制台消息输入/输出。*/import java.io.*;import java.text.SimpleDateFormat;import ja…

java 最大分词算法_Java实现的最大匹配分词算法详解

本文实例讲述了java实现的最大匹配分词算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;全文检索有两个重要的过程&#xff1a;1分词2倒排索引我们先看分词算法目前对中文分词有两个方向&#xff0c;其中一个是利用概率的思想对文章分词。 也就是如果两个字&#x…

java 集合迭代器_Java中的集合迭代器

集合的迭代器任何集合都有迭代器。任何集合类&#xff0c;都必须能以某种方式存取元素&#xff0c;否则这个集合容器就没有任何意义。迭代器&#xff0c;也是一种模式(也叫迭代器模式)。在java中它是一个对象&#xff0c;其目的是遍历并选中其中的每个元素&#xff0c;而使用者…

git关闭密码自动存储_项目在 git 里怎样合理的保存配置文件(服务器密码等敏感内容)...

办法其实很多&#xff0c;有两种较常用。第一种是配置文件不提交真实内容&#xff0c;只提交一个模板文件。每个开发者克隆之后按照自己的环境补完配置文件&#xff0c;这样自然而然就独立出来了(需更改文件名并忽略有效配置文件)。如果配置文件很大配置项很多&#xff0c;此法…

isfull mysql_Mysql8.0及以上版本,关于only_full_group_by的问题

mysql8.0及以上版本&#xff0c;关于only_full_group_by的问题&#xff1a;ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column postscan.verifyDelayLog.auditor which is not functionally dependent on column…

java jnotify_Jnotify文件监控的用法以及Jar文件导入的方法

简介Jnotiy, 支持动态监控(支持级联监控)文件夹和文件的jar包。在linux中&#xff0c;调用linux底层的jnotify服务。在windows中&#xff0c;需要添加附件的dll文件。因为通用的Maven仓库中没有此Jar文件&#xff0c;pom.xml文件需要如下配置&#xff1a;net.contentobjects.jn…

java 异常练习题_Java 异常(习题)

异常Key Point* 异常的概念和分类* 异常的产生和传递* 异常的处理* 自定义异常练习1. 填空Java 中所有的错误都继承自throwable类&#xff1b;在该类的子类中&#xff0c;Error类表示严重的底层错误&#xff0c;对于这类错误一般处理的方式是不要求我们对其处理Exception类表示…

mysql 半同步 主主_MySQL主从,半同步,主主复制

MySQL Replication我们知道&#xff0c;MySQL数据库的二进制日志记录着每一个明确或者潜在可能导致数据库发生改变的sql语句&#xff0c;因此我们可以基于二进制日志来实现mysql的主从一致。而我们在此提到的mysql的复制的简单过程就是&#xff1a;首先mysql的主服务器(Master)…

java local_java.time.LocalDateTime with()方法

java.time.LocalDateTime with()方法java.time.LocalDateTime.with(TemporalAdjuster adjuster)方法返回此日期时间的调整副本。1 语法public LocalDateTime with(TemporalAdjuster adjuster)2 参数adjuster&#xff1a;要使用的调整器&#xff0c;而不是null。3 返回值一个Loc…

java 数据队列_Java 数据结构 - 队列

Java 数据结构 - 队列我们今天要讲的数据结构是队列&#xff0c;比如 Java 线程池任务就是队列实现的。1. 什么是队列和栈一样&#xff0c;队列也是一种操作受限的线性结构。使用队列时&#xff0c;在一端插入元素&#xff0c;而在另一端删除元素。1.1 队列的主要特性队列中的数…

java中死锁_关于java中死锁的总结

关于死锁&#xff0c;估计很多程序员都碰到过&#xff0c;并且有时候这种情况出现之后的问题也不是非常好排查&#xff0c;下面整理的就是自己对死锁的认识&#xff0c;以及通过一个简单的例子来来接死锁的发生&#xff0c;自己是做python开发的&#xff0c;但是对于死锁的理解…

eclipse java的jvm匹配_eclipse设置jvm

Java虚拟机默认分配64M内存&#xff0c;如果你的应用比较大&#xff0c;超出64M内存&#xff0c;Java虚拟机就会抛出outOfMemoryError&#xff0c;并停止运行。不管是什么应用(Web应用、Application等)&#xff0c;只需要修改你的机器上的运行Java命令&#xff0c;在javaxxx命令…

java+set+split_阿里资深工程师教你如何优化 Java 代码!

原标题&#xff1a;阿里资深工程师教你如何优化 Java 代码&#xff01;作者 | 王超责编 | 伍杏玲明代王阳明先生在《传习录》谈为学之道时说&#xff1a;私欲日生&#xff0c;如地上尘&#xff0c;一日不扫&#xff0c;便又有一层。着实用功&#xff0c;便见道无终穷&#xff0…

java返回特定下标元素_java基础--输出数组中指定元素的下标

java基础--输出数组中指定元素的下标java基础--输出数组中指定元素的下标package com.lcn.day05;public class ArrayDemo8 {/*** 输出数组指定元素的下标*/public static void main(String[] args) {//定义一个数组int[] array new int[]{123,456,789,321,654,987};int index …

java钱币换算_Java编写钱币转换为大写程序

import java.text.DecimalFormat;public class ChangeMonney {private static final String[] STR_UNIT {"零", "壹", "贰", "叁", "肆", "伍","陆", "柒", "捌", "玖"…

java mongodb 使用场景_mongodb使用场景一般是什么?mongodb有哪些基本命令?

此前我们已经充分了解过了mongodb的原理及各种概念&#xff0c;你们知道一般在什么场景下才会使用mongodb吗?下面通过文章来了解一下吧。一、mongodb基本命令1)、数据库切换use admin;2)、浏览当前数据库db;3)、浏览全部数据库show dbs;4)、删除数据库use test;db.dropDatabas…

java desktop mailto,mailto在Java?

I am trying to set a hyperlink in my eclipse java project.when someone clicks on a button, it should open up an email client along with the givenemail id. is it possible to implement it with java.awt.Desktop?解决方案Yes it is possible using desktop.mail()…