从Set里面取出有序的记录

Set里面的记录是无序的。假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet。而不是HashSet。在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,TreeSet在进行排序的时候就是通过比較它们的Comparable接口的实现。

以下是HashSet的无序和TreeSet的有序的比較:

Test类:

Java代码

  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5. public class Test {
  6. public static void main(String args[]) {
  7. useHashSet();
  8. useTreeSet();
  9. }
  10. /**
  11. * Set默认是无序的。一般从Set里面拿出来的数据每次的顺序都会是不一样的,假设想里面的顺序一样
  12. * 就使用TreeSet
  13. */
  14. public static void useHashSet() {
  15. System.out.println("-----------------HashSet Start------------------");
  16. Set<User> set = new HashSet<User>();
  17. for (int i = 0; i < 10; i++) {
  18. User user = new User((i + 1), "uname" + (i + 1), "pswd" + (i + 1));
  19. set.add(user);
  20. }
  21. Iterator<User> iter = set.iterator();
  22. while (iter.hasNext())
  23. System.out.println(iter.next());
  24. System.out.println("------------------HashSet End----------------------");
  25. }
  26. /**
  27. * TreeSet是有序的。TreeSet在给里面的元素排序是通过它们的Comparable接口的实现来比較的,所以,
  28. * 假设里面的对象没有实现Comparable接口,则TreeSet在执行时就会报错,所以假设想从Set里面拿出来的数据是
  29. * 有序的就得使里面的对象实现Comparable接口,User2是实现了Comparable接口的,并对它们的id进行比較。id大
  30. * 的就会排在后面
  31. */
  32. public static void useTreeSet() {
  33. System.out.println("-----------------TreeSet Start------------------");
  34. Set<User2> set = new TreeSet<User2>();
  35. for (int i = 0; i < 10; i++) {
  36. User2 user = new User2((i + 1), "uname" + (i + 1), "pswd" + (i + 1));
  37. set.add(user);
  38. }
  39. Iterator<User2> iter = set.iterator();
  40. while (iter.hasNext())
  41. System.out.println(iter.next());
  42. System.out.println("------------------TreeSet End----------------------");
  43. }
  44. }

User类:

Java代码

  1. public class User {
  2. private int id;
  3. private String username;
  4. private String password;
  5. public User() {
  6. }
  7. public User(int id, String username, String password) {
  8. this.id = id;
  9. this.username = username;
  10. this.password = password;
  11. }
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getPassword() {
  25. return password;
  26. }
  27. public void setPassword(String password) {
  28. this.password = password;
  29. }
  30. @Override
  31. public int hashCode() {
  32. final int prime = 31;
  33. int result = 1;
  34. result = prime * result + id;
  35. return result;
  36. }
  37. @Override
  38. public boolean equals(Object obj) {
  39. if (this == obj)
  40. return true;
  41. if (obj == null)
  42. return false;
  43. if (getClass() != obj.getClass())
  44. return false;
  45. User other = (User) obj;
  46. if (id != other.id)
  47. return false;
  48. return true;
  49. }
  50. @Override
  51. public String toString() {
  52. return " id = " + id + ", \r\n username = " + username
  53. + ", \r\n password = " + password;
  54. }
  55. }

User2类:

Java代码

  1. public class User2 implements Comparable<User2> {
  2. private int id;
  3. private String username;
  4. private String password;
  5. public User2() {
  6. }
  7. public User2(int id, String username, String password) {
  8. this.id = id;
  9. this.username = username;
  10. this.password = password;
  11. }
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getPassword() {
  25. return password;
  26. }
  27. public void setPassword(String password) {
  28. this.password = password;
  29. }
  30. @Override
  31. public int hashCode() {
  32. final int prime = 31;
  33. int result = 1;
  34. result = prime * result + id;
  35. return result;
  36. }
  37. @Override
  38. public boolean equals(Object obj) {
  39. if (this == obj)
  40. return true;
  41. if (obj == null)
  42. return false;
  43. if (getClass() != obj.getClass())
  44. return false;
  45. User2 other = (User2) obj;
  46. if (id != other.id)
  47. return false;
  48. return true;
  49. }
  50. @Override
  51. public String toString() {
  52. return " id = " + id + ", \r\n username = " + username
  53. + ", \r\n password = " + password;
  54. }
  55. @Override
  56. public int compareTo(User2 user) {
  57. // TODO Auto-generated method stub
  58. //这里我的实现是依照id进行排序
  59. if (user == null)
  60. return 1;
  61. if (id > user.getId())
  62. return 1;
  63. else if (id == user.getId())
  64. return 0;
  65. else
  66. return -1;
  67. }
  68. }

执行结果:

Hello代码

  1. -----------------HashSet Start------------------
  2. id = 3,
  3. username = uname3,
  4. password = pswd3
  5. id = 4,
  6. username = uname4,
  7. password = pswd4
  8. id = 1,
  9. username = uname1,
  10. password = pswd1
  11. id = 2,
  12. username = uname2,
  13. password = pswd2
  14. id = 7,
  15. username = uname7,
  16. password = pswd7
  17. id = 8,
  18. username = uname8,
  19. password = pswd8
  20. id = 5,
  21. username = uname5,
  22. password = pswd5
  23. id = 6,
  24. username = uname6,
  25. password = pswd6
  26. id = 9,
  27. username = uname9,
  28. password = pswd9
  29. id = 10,
  30. username = uname10,
  31. password = pswd10
  32. ------------------HashSet End----------------------
  33. -----------------TreeSet Start------------------
  34. id = 1,
  35. username = uname1,
  36. password = pswd1
  37. id = 2,
  38. username = uname2,
  39. password = pswd2
  40. id = 3,
  41. username = uname3,
  42. password = pswd3
  43. id = 4,
  44. username = uname4,
  45. password = pswd4
  46. id = 5,
  47. username = uname5,
  48. password = pswd5
  49. id = 6,
  50. username = uname6,
  51. password = pswd6
  52. id = 7,
  53. username = uname7,
  54. password = pswd7
  55. id = 8,
  56. username = uname8,
  57. password = pswd8
  58. id = 9,
  59. username = uname9,
  60. password = pswd9
  61. id = 10,
  62. username = uname10,
  63. password = pswd10
  64. ------------------TreeSet End----------------------
时间: 2024-11-03 22:01:57

从Set里面取出有序的记录的相关文章

从mysql数据表中随机取出一条记录

核心查找数据表代码: select * from 表名 order by rand( ) limit 1; //此处的1就是取出数据的条数 但这样取数据网上有人说效率非常差的,那么要如何改进呢 搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据. SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 WHERE t1.i

LinkedHashMap唯一,存储取出有序

package cn.itcast_03; import java.util.LinkedHashMap; import java.util.Set; /* * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序. * 由哈希表保证键的唯一性 * 由链表保证键盘的有序(存储和取出的顺序一致) */ public class LinkedHashMapDemo { public static void main(String[] args) { // 创建集合对象

LinkedHashSet 元素唯一,存储取出有序

  package cn.itcast_04; import java.util.LinkedHashSet; /* * LinkedHashSet:底层数据结构由哈希表和链表组成. * 哈希表保证元素的唯一性. * 链表保证元素有素.(存储和取出是一致) */ public class LinkedHashSetDemo { public static void main(String[] args) { // 创建集合对象 LinkedHashSet<String> hs = new Li

主表插入一条记录,取出主表的记录主键,赋值给予从表多条记录使用

public void CreateWorkOrdGrid(Pp_WorkOrd_Hd headObject, List<Pp_WorkOrd_Dt> bodyObject) { //方式一 using (var transction = project.Database.BeginTransaction()) { project.Pp_WorkOrd_Hd.Add(headObject); foreach (Pp_WorkOrd_Dt a in bodyObject) { a.Pp_Work

【Redis源码剖析】 - Redis数据类型之有序集合zset

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51231967 这周事情比较多,原本计划每周写两篇文章的任务看来是完不成了.今天为大家带来有序集合zset的源码分析. Redis中的zset主要支持以下命令: zadd.zincrby zrem.zremrangebyrank.zremrangebyscore.zremrangebyrank zrange.zrevrange.zrangebyscore.zrevrangebys

Java遇见HTML——JSP篇之商品浏览记录的实现

一.项目总体介绍 使用Cookie实现商品浏览记录. 要实现这个程序采取的是Model1(Jsp+JavaBean)架构实现,具体步骤: 首先要有个数据库,商品表,操作数据库的一个类DBHelper类 创建实体类(与数据库表一一对应) 创建业务逻辑类(DAO) 创建页面层 二.DBHelper类设计 1 package util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 6 public class D

mongodb随机查询一条记录的正确方法!

关于从mongodb库中随机取出一条记录的方法的博文很多,其中都提到了下面三种方法: 1.skip过随机数量的记录. DBCursor cursor = coll.find(query); int rint = random.nextInt(cursor.count()); cursor.skip(rint); DBObject word = null; if(cursor.hasNext()){ word = cursor.next(); cursor.close(); } 很多人说不推荐这种

c++ 有序二叉树的应用

实作:以有序二叉树记录学生签到时间及名字,然后以名字升序输出学生签到信息 stricmp,strcmpi 原型:extern int stricmp(char *s1,char * s2); 用法:#include <string.h> 功能:比较字符串s1和s2,但不区分字母的大小写. 说明:strcmpi是到stricmp的宏定义,实际未提供此函数. 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0 一.修改 CreateNode

Oracle中随机抽取N条记录

一.Oracle取随机数据  1.Oracle访问数据的基本方法:  1).全表扫描(Full table Scan):执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件.Oracle顺序的读分配给该表的每一个数据块,且每个数据块Oracle只读一次.这样全表扫描能够受益于多块读. 2).采样表扫描(sample table scan):扫描返回表中随机采样数据,这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项.     注:从Ora