Java 从Set里面取出有序的记录详解及实例

Java 从Set里面取出有序的记录详解及实例

Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSet,而不是HashSet,在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,TreeSet在进行排序的时候就是通过比较它们的Comparable接口的实现!

下面是HashSet的无序和TreeSet的有序的比较:

Test类:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; 

public class Test { 

  public static void main(String args[]) { 

    useHashSet();
    useTreeSet(); 

  } 

  /**
   * Set默认是无序的,一般从Set里面拿出来的数据每次的顺序都会是不一样的,如果想里面的顺序一样
   * 就使用TreeSet
   */
  public static void useHashSet() {
    System.out.println("-----------------HashSet Start------------------");
    Set<User> set = new HashSet<User>();
    for (int i = 0; i < 10; i++) {
      User user = new User((i + 1), "uname" + (i + 1), "pswd" + (i + 1));
      set.add(user);
    }
    Iterator<User> iter = set.iterator();
    while (iter.hasNext())
      System.out.println(iter.next());
    System.out.println("------------------HashSet End----------------------");
  } 

  /**
   * TreeSet是有序的,TreeSet在给里面的元素排序是通过它们的Comparable接口的实现来比较的,所以,
   * 如果里面的对象没有实现Comparable接口,则TreeSet在运行时就会报错,所以如果想从Set里面拿出来的数据是
   * 有序的就得使里面的对象实现Comparable接口,User2是实现了Comparable接口的,并对它们的id进行比较,id大
   * 的就会排在后面
   */
  public static void useTreeSet() {
    System.out.println("-----------------TreeSet Start------------------");
    Set<User2> set = new TreeSet<User2>();
    for (int i = 0; i < 10; i++) {
      User2 user = new User2((i + 1), "uname" + (i + 1), "pswd" + (i + 1));
      set.add(user);
    }
    Iterator<User2> iter = set.iterator();
    while (iter.hasNext())
      System.out.println(iter.next());
    System.out.println("------------------TreeSet End----------------------");
  } 

}

 User类:

public class User { 

  private int id;
  private String username;
  private String password; 

  public User() {
  } 

  public User(int id, String username, String password) {
    this.id = id;
    this.username = username;
    this.password = password;
  } 

  public int getId() {
    return id;
  } 

  public void setId(int id) {
    this.id = id;
  } 

  public String getUsername() {
    return username;
  } 

  public void setUsername(String username) {
    this.username = username;
  } 

  public String getPassword() {
    return password;
  } 

  public void setPassword(String password) {
    this.password = password;
  } 

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
  } 

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    User other = (User) obj;
    if (id != other.id)
      return false;
    return true;
  } 

  @Override
  public String toString() {
    return " id = " + id + ", \r\n username = " + username
        + ", \r\n password = " + password;
  } 

}

User2类:

public class User2 implements Comparable<User2> { 

  private int id;
  private String username;
  private String password; 

  public User2() {
  } 

  public User2(int id, String username, String password) {
    this.id = id;
    this.username = username;
    this.password = password;
  } 

  public int getId() {
    return id;
  } 

  public void setId(int id) {
    this.id = id;
  } 

  public String getUsername() {
    return username;
  } 

  public void setUsername(String username) {
    this.username = username;
  } 

  public String getPassword() {
    return password;
  } 

  public void setPassword(String password) {
    this.password = password;
  } 

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
  } 

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    User2 other = (User2) obj;
    if (id != other.id)
      return false;
    return true;
  } 

  @Override
  public String toString() {
    return " id = " + id + ", \r\n username = " + username
        + ", \r\n password = " + password;
  } 

  @Override
  public int compareTo(User2 user) {
    // TODO Auto-generated method stub
    //这里我的实现是按照id进行排序
    if (user == null)
      return 1;
    if (id > user.getId())
      return 1;
    else if (id == user.getId())
      return 0;
    else
      return -1;
  } 

}

运行结果:

-----------------HashSet Start------------------
 id = 3,
 username = uname3,
 password = pswd3
 id = 4,
 username = uname4,
 password = pswd4
 id = 1,
 username = uname1,
 password = pswd1
 id = 2,
 username = uname2,
 password = pswd2
 id = 7,
 username = uname7,
 password = pswd7
 id = 8,
 username = uname8,
 password = pswd8
 id = 5,
 username = uname5,
 password = pswd5
 id = 6,
 username = uname6,
 password = pswd6
 id = 9,
 username = uname9,
 password = pswd9
 id = 10,
 username = uname10,
 password = pswd10
------------------HashSet End----------------------
-----------------TreeSet Start------------------
 id = 1,
 username = uname1,
 password = pswd1
 id = 2,
 username = uname2,
 password = pswd2
 id = 3,
 username = uname3,
 password = pswd3
 id = 4,
 username = uname4,
 password = pswd4
 id = 5,
 username = uname5,
 password = pswd5
 id = 6,
 username = uname6,
 password = pswd6
 id = 7,
 username = uname7,
 password = pswd7
 id = 8,
 username = uname8,
 password = pswd8
 id = 9,
 username = uname9,
 password = pswd9
 id = 10,
 username = uname10,
 password = pswd10
------------------TreeSet End----------------------

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java通过PropertyDescriptor反射调用set和get方法

    本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.beans.PropertyDescriptor; public class PropertyUtil { @SuppressWarnings("unchecked") p

  • java中实现list或set转map的方法

    java中实现list或set转map的方法 在开发中我们有时需要将list或set转换为map(比如对象属性中的唯一键作为map的key,对象作为map的value),一般的想法就是new一个map,然后把list或set中的值一个个push到map中. 类似下面的代码: List<String> stringList = Lists.newArrayList("t1", "t2", "t3"); Map<String, St

  • Java中List Set和Map之间的区别_动力节点Java学院整理

    Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的

  • Java中的HashSet详解和使用示例_动力节点Java学院整理

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

  • 利用Java Set 去除重复object的方法

    实例如下: import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 编写者:CP * <br />类描述:set集合针对String 类型和8大基础数据类型 过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,

  • 详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法.如果只做简单遍历读取,增强for循环确实减轻不少的代码量. 集合概念: 1.作用:用于存放对象 2.相当于一个容器,里面包含着一组对象,其中的每个对象作为集合的一个元素出现 3.jav

  • Java 从Set里面取出有序的记录详解及实例

    Java 从Set里面取出有序的记录详解及实例 Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSet,而不是HashSet,在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,TreeSet在进行排序的时候就是通过比较它们的Comparable接口的实现! 下面是HashSet的无序和TreeSet的有序的比较: Test类: import java.util.HashSet; import java.util.Iterato

  • Java异常处理运行时异常(RuntimeException)详解及实例

      Java异常处理运行时异常(RuntimeException)详解及实例 RuntimeException RunntimeException的子类: ClassCastException 多态中,可以使用Instanceof 判断,进行规避 ArithmeticException 进行if判断,如果除数为0,进行return NullPointerException 进行if判断,是否为null ArrayIndexOutOfBoundsException 使用数组length属性,避免越

  • Java并发编程之Semaphore(信号量)详解及实例

    Java并发编程之Semaphore(信号量)详解及实例 概述 通常情况下,可能有多个线程同时访问数目很少的资源,如客户端建立了若干个线程同时访问同一数据库,这势必会造成服务端资源被耗尽的地步,那么怎样能够有效的来控制不可预知的接入量呢?及在同一时刻只能获得指定数目的数据库连接,在JDK1.5 java.util.concurrent 包中引入了Semaphore(信号量),信号量是在简单上锁的基础上实现的,相当于能令线程安全执行,并初始化为可用资源个数的计数器,通常用于限制可以访问某些资源(物

  • Java 利用dom方式读取、创建xml详解及实例代码

    Java 利用dom方式读取.创建xml详解 1.创建一个接口 XmlInterface.Java public interface XmlInterface { /** * 建立XML文档 * @param fileName 文件全路径名称 */ public void createXml(String fileName); /** * 解析XML文档 * @param fileName 文件全路径名称 */ public void parserXml(String fileName); }

  • java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器. SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接.SSH提

  • java 线程公平锁与非公平锁详解及实例代码

    java 线程公平锁与非公平锁详解 在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync.公平锁的作用就是严格按照线程启动的顺序来执行的,不允许其他线程插队执行的:而非公平锁是允许插队的. 默认情况下ReentrantLock是通过非公平锁来进行同步的,包括synchronized关键字都是如此,因为这样性能会更好.因为从线程进入了RUNNABLE状态,可以执行开始,到实际线程执行是要比较久的时间的.而且,在一个锁释放之后,其

  • java 中使用匿名类直接new接口详解及实例代码

    java:使用匿名类直接new接口 java中的匿名类有一个倍儿神奇的用法,见下面代码示例: package contract; public interface ISay { void sayHello(); } 上面是一个简单的接口,下面是如何使用: package jimmy; import contract.ISay; public class Program { public static void main(String[] args) { ISay say = new ISay()

  • java 重载(overload)与重写(override)详解及实例

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参数不同的方法组.本质是对不同方法的称呼. override(覆写):存在继承关系的两个类之间,在子类中重新定义了父类中存在的方法.本质是针对同一个方法,给出不同的实现. 我们先来看重载的例子: public class OverloadParent{ public String getPerson(

  • Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引 ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步 LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快) Vector

  • Java并发中的Fork/Join 框架机制详解

    什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务.通过其命名也很容易看出框架主要分为 Fork 和 Join 两个阶段,第一阶段 Fork 是把一个大任务拆分为多个子任务并行的执行,第二阶段 Join 是合并这些子任务的所有执行结果,最后得到大任务的结果. 这里不难发现其执行主要流程:首先判断一个任务是否足够小,如果任务足够小,则直接计算,否则,就拆分成几个

随机推荐