如何使Java中的set集合内容有序

记忆旅途 2017-05-14 12:55:13
java中的set集合是无序不重复排列的,有什么方法能够使set有序排列吗?
...全文
1337 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingyuner2 2017-05-15
  • 打赏
  • 举报
回复
4楼的回答好经典
Hansy Chen 2017-05-14
  • 打赏
  • 举报
回复
测试类 [code=java ]package com.set.sort; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import org.junit.Test; public class SetSortTest { /* =============使用 HashSet 无序,不重复============== */ @Test public void test1() { Set<String> set = new HashSet<String>(); set.add("H"); set.add("A"); set.add("S"); set.add("H"); set.add("S"); set.add("E"); set.add("T"); // 遍历 输出 : A S T E H for (Iterator iterator = set.iterator(); iterator.hasNext();) { String str = (String) iterator.next(); System.out.print(str + "\t"); } System.out.println(); } /* =============使用 TreeSet 进行排序,默认是升序排序============== */ @Test public void test2() { Set<String> set1 = new TreeSet<String>(); set1.add("H"); set1.add("A"); set1.add("S"); set1.add("H"); set1.add("S"); set1.add("E"); set1.add("T"); // 遍历 输出 : A E H S T for (Iterator iterator = set1.iterator(); iterator.hasNext();) { String str = (String) iterator.next(); System.out.print(str + "\t"); } System.out.println(); } /* =============使用 TreeSet 进行降序排序,默认是升序排序============== */ @Test public void test3() { Set<String> set2 = new TreeSet<String>(new InvertedComparetor()); set2.add("H"); set2.add("A"); set2.add("S"); set2.add("H"); set2.add("S"); set2.add("E"); set2.add("T"); // 遍历 输出 : T S H E A for (Iterator iterator = set2.iterator(); iterator.hasNext();) { String str = (String) iterator.next(); System.out.print(str + "\t"); } System.out.println(); } /*======如果Set集合中存放的是我们自定义的类的类型,我们要定义一个排序规则类,该类要实现Comparetor接口,重写compareTo方法=======*/ @Test public void test4() { // 按uid进行排序 Set<User> users = new TreeSet<User>(new UserComparetor()); users.add(new User("1001", "ShayChen", 24)); users.add(new User("1002", "ShayBoke", 23)); users.add(new User("1006", "Shay", 25)); users.add(new User("1007", "Shay1", 25)); users.add(new User("1003", "Chen", 27)); for (Iterator iterator = users.iterator(); iterator.hasNext();) { User user = (User) iterator.next(); System.out.println(user); } } /*======如果Set集合中存放的是我们自定义的类的类型,可以重写hashCode和equals方法进行排序=======*/ @Test public void test5() { // 按uid进行降序排序 Set<User2> users = new HashSet<User2>(); users.add(new User2("1001", "ShayChen", 24)); users.add(new User2("1002", "ShayBoke", 23)); users.add(new User2("1007", "Shay1", 25)); users.add(new User2("1006", "Shay", 25)); users.add(new User2("1003", "Chen", 27)); for (Iterator iterator = users.iterator(); iterator.hasNext();) { User2 user = (User2) iterator.next(); System.out.println(user); } } } [/code] POJO类 User

package com.set.sort;

import java.util.Comparator;

public class User implements Comparator<User> {
	//	fields
	private String uid;
	private String name;
	private Integer age;
	
	//	constructor using fields
	public User(String uid, String name, Integer age) {
		super();
		this.uid = uid;
		this.name = name;
		this.age = age;
	}
	
	//	getter and setter method
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [ uid=" + uid + ", name=" + name + ", age=" + age + " ]";
	}

	@Override
	public int compare(User o1, User o2) {
		return o1.getUid().compareTo(o2.getUid());		//	通过用户的ID进行升序排序
	}
	
}

POJO类 User2.java

package com.set.sort;


public class User2 {
	//	fields
	private String uid;
	private String name;
	private Integer age;
	
	//	constructor using fields
	public User2(String uid, String name, Integer age) {
		super();
		this.uid = uid;
		this.name = name;
		this.age = age;
	}
	
	//	getter and setter method
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [ uid=" + uid + ", name=" + name + ", age=" + age + " ]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((uid == null) ? 0 : uid.hashCode());
		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 (uid == null) {
			if (other.uid != null)
				return false;
		} else if (!uid.equals(other.uid))
			return false;
		return true;
	}
	
}
比较规则类:InvertedComparetor .java

package com.set.sort;

import java.util.Comparator;

public class InvertedComparetor implements Comparator<String> {

	@Override
	public int compare(String o1, String o2) {
		return o2.compareTo(o1);	//降序排列
	}

}

李德胜1995 2017-05-14
  • 打赏
  • 举报
回复
可以用TreeSet使用比较器也可以用Collections.sort进行排序。。。。
MikeDDT009 2017-05-14
  • 打赏
  • 举报
回复
如果想实现数据用set来存,但是显示的时候我想看到有序的效果,那么就是你自己来实现。 思路是这样:遍历set集合,每次把数据取出来放入list集合里面来进行有序管理。反正整体看你
MikeDDT009 2017-05-14
  • 打赏
  • 举报
回复
想要有序不用set不就完了。主要这里的无序是指的位置顺序和存入的顺序无关!想要有点顺序用treemap。为什么集合要分那么多个,在我看来就是功能的细化。而set集合的主要作用就是不重复。这里的不重复和map的不重复又有区别。set的重复在于重复的数据无法添加进去。而map的在于重复的数据会覆盖前面的数据。 想要按照自己指定的方法来玩排序,还是用list来存吧。list的有序指的是存数据的位置按照输入顺序来存,第一个必然是输入的第一个数这样。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧