天天看点

Java——TreeSet类通过使用比较器排序,实现给字符串排序且不删除重复字符

在学TreeSet类中,因为TreeSet类底层使二叉树,所以使用其排序时,得使用恰当,否则运行时会发生错误,还有的就是得学会用比较器排序。需要实现Comparable接口,并重写comparaTo方法,写出要排序的规则,比如说按字符串长度排序,还是按字母表的顺序排序,都得自己在里面实现。

以下是两个小程序,分别实现的功能有:

1.在一个集合中存储了无序并且重复的字符串,将其排序且不删除重复。

2.输入一串字符串,对其中所有字符进行排序。

package pra_12;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

public class J_25 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//1.在一个集合中存储了无序并且重复的字符串,将其排序且不删除重复
		ArrayList<String> list=new ArrayList<>();
		list.add("aaa");
		list.add("b");
		list.add("aaccca");
		list.add("ddd");
		list.add("aaa");
		list.add("aasdasaa");
		
		sort(list);
		System.out.println(list);	//[aaa, aaa, aaccca, aasdasaa, b, ddd]
		//2.输入一串字符串,对其中所有字符进行排序
		Scanner sc=new Scanner(System.in);
		String line=sc.nextLine();	//fdsifunksafdsfsdnf
		char[] arr=line.toCharArray();		
		TreeSet<Character> ts=new TreeSet<Character>(new Comparator<Character>(){

			@Override
			public int compare(Character o1, Character o2) {
				int num=o1-o2;
				return num==0?-1:num;
			}
			
		});
		for(char c:arr){
			ts.add(c);
		}
		for (Character character : ts) {
			System.out.print(character);	//adddfffffiknnssssu
		}
		
		
}
	//1.
	public static void sort(List<String> list){
		TreeSet<String> ts=new TreeSet<>(new Comparator<String>(){	//用匿名内部类实现Comparator接口
			
			@Override
			//重写compare方法
			public int compare(String o1, String o2) {
				int num=o1.compareTo(o2);
				return num==0?-1:num;		//为了使重复的字符串能存进去
			}
			
		});
		ts.addAll(list);
		list.clear();
		list.addAll(ts);
	}
}