`

java中的自动排序集合 ---- 20160809

    博客分类:
  • java
阅读更多

TreeSet的实现:

http://blog.csdn.net/hudashi/article/details/6943522

TreeMap实现:

http://blog.csdn.net/hudashi/article/details/6944059

需要注意:

1. 当利用comparator比较两个元素相等时,插入的时候会失败。而hashset是发现两个元素相等(即:两个元素的hashcode相同,equals方法比较之后也相等)时,插入失败返回false。这说明可能treeset并不是真正的set,因为即使两个元素的hashcode相同,equals方法比较之后也相等,但是如果comparator返回两个对象不相等,也是可以插入的,而hashset插入事则会失败。

2. 排序只在插入时发生,如果后面你修改了元素的数据,元素的位置不会变。

测试类:

ChineseCharCount, 保存一个字符和它出现的次数。本来想测试读取一个文件中的所有中文字符,然后得到出现最多的字符以及出现了多少次的。本想用treeset进行排序,但是发现不行,最后还是直接用的ArrayList,然后用Collections的sort

(Comparator comparator)方法完成的。

 

 

package _00_ReadAndCountChineseCharacters;

public class ChineseCharCount {

	char ch;
	int count;
	
	public ChineseCharCount(char ch, int count) {
		// TODO Auto-generated constructor stub
		this.ch = ch;
		this.count = count;
	}

	public char getCh() {
		return ch;
	}

	public void setCh(char ch) {
		this.ch = ch;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public String toString() {
		return ch + ":appeared " + count + " times";
	}

	public int getCount() {
		return count;
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (obj == null) {
			return false;
		}
		if (obj == this) {
			return true;
		}
		if (!(obj instanceof ChineseCharCount)) {
			return false;
		}
		ChineseCharCount te = (ChineseCharCount) obj;
		if (te.ch == this.ch) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return (ch + "").hashCode();
	}
}

 

ChineseCharComparator,直接通过比较count来对比大小。

package _00_ReadAndCountChineseCharacters;

import java.util.Comparator;

public class ChineseCharComparator implements Comparator<ChineseCharCount>{

	public int compare(ChineseCharCount o1, ChineseCharCount o2) {
		// TODO Auto-generated method stub
		
		if(o1 == o2)
			return 0;
		if(o1!=null&&o2==null)
			return -1;
		else if(o1==null&&o2!=null)
			return 1;
		if (o1.count < o2.count)
			return 1;
		else if (o1.count > o2.count)
			return -1;
		else
			return 0;
	}
}

 

ReadAndCountChineseCharacters,测试类。直接读取文件,count,然后排序,输出前三。

package _00_ReadAndCountChineseCharacters;

import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.TreeSet;

public class ReadAndCountChineseCharacters {

	public static void main(String[] args) throws Exception {
		String classPath = ReadAndCountChineseCharacters.class.getResource("").getPath();
		System.out.println(classPath);
		String filePath = classPath + "ChineseSentence.txt";
		// InputStream in = new FileInputStream(filePath);

		
		List<ChineseCharCount> chList = new ArrayList<ChineseCharCount>();

		FileReader fr = new FileReader(filePath);
		int i;
		while ((i = fr.read()) != -1) {
			char next = (char) i;
			if(next == '\n' || next  == '\t')
				continue;
			boolean hasCh = false;
			for (ChineseCharCount chCount : chList) {
				if (next == chCount.ch) {
					hasCh = true;
					chCount.count = chCount.count + 1;
					break;
				}
			}
			if (!hasCh) {
				chList.add(new ChineseCharCount(next, 1));
				
			}
		}
		fr.close();
		
		ChineseCharComparator comparator = new ChineseCharComparator();
		Collections.sort(chList, comparator);
		
		for (int j = 0; j < 3; j++) {
			System.out.println(chList.get(j));
		}
	}

}

 

 TestTreeSet 编写排序时,遇到的问题,通过下面的测试类进行了总结:

package _00_ReadAndCountChineseCharacters;

import java.util.HashMap;
import java.util.HashSet;
import java.util.TreeSet;

public class TestTreeSet {
	
	public static void main(String[] args) {
		
		ChineseCharCount ch = new ChineseCharCount('a', 1);
		ChineseCharCount ch2 = new ChineseCharCount('a', 2);
		ChineseCharCount ch3 = new ChineseCharCount('a', 1);
		ChineseCharCount ch4 = new ChineseCharCount('c', 1);
		
		ChineseCharComparator comparator = new ChineseCharComparator();
		TreeSet<ChineseCharCount> treeSet = new TreeSet<>(comparator);
		HashSet<ChineseCharCount> hashSet = new HashSet<>();
		
		HashMap<String, String> haspMap = new HashMap<>();
		
		/*
		 * Associates the specified value with the specified key in this map. 
		 * If the map previously contained a mapping for the key, the old value is replaced.
		 * 
		 * the previous value associated with key, or null if there was no mapping for key. 
		 * (A null return can also indicate that the map previously associated null with key.)
		 */
		haspMap.put("1", "1");
		
		System.out.println("abc123".hashCode());
		System.out.println("".hashCode());
		System.out.println(new String("abc123").hashCode());
		System.out.println(new String("").hashCode());
		
		
		/*
		 * Adds the specified element to this set if it is not already present. 
		 * More formally, adds the specified element e to this set if the set 
		 * contains no element e2 such that (e==null ? e2==null : e.equals(e2)). 
		 * If this set already contains the element, the call leaves the set unchanged and returns false.
		 */
		System.out.println("add into treeset");
		System.out.println(treeSet.add(ch));
		System.out.println(treeSet.add(ch2));
		System.out.println(treeSet.add(ch3));
		System.out.println(treeSet.add(ch4));
		
		
		/*
		 * Adds the specified element to this set if it is not already present. 
		 * More formally, adds the specified element e to this set if this set 
		 * contains no element e2 such that (e==null ? e2==null : e.equals(e2)). 
		 * If this set already contains the element, the call leaves the set unchanged and returns false.
		 */
		System.out.println("add into hashSet");
		System.out.println(hashSet.add(ch));
		System.out.println(hashSet.add(ch2));
		System.out.println(hashSet.add(ch3));
		System.out.println(hashSet.add(ch4));
		System.out.println("From the test result we can see, "
				+ "treeset is not really a set. AS it allowed duplicate "
				+ "attribute(determinter by hashCode and equals method). "
				+ "Instead, it didn't allwed two attributes wihich is "
				+ "equals to each other(determined by the comparator).");
		
		
		/*
		 * 从测试结果可以看出,如果两个元素利用comparator进行比较是相等的插入会失败。
		 */
		for(ChineseCharCount chs : treeSet)
			System.out.println(chs);
		
		treeSet.first().count = 0;
		treeSet.last().count = 2;
		System.out.println(treeSet.add(ch3));
		
		
		/*
		 * 从测试结果可以看出,treeset只会在存入set的时候进行排序,
		 * 当做了更改时不会重新排序。
		 */
		for(ChineseCharCount chs : treeSet)
			System.out.println(chs);
		
		
	}

}

 

 

分享到:
评论

相关推荐

    Java源码分析:集合-容器.pdf

    在Java集合框架中,各种集合类型的自动扩容机制是提高性能的关键。当集合的容量不足以容纳更多元素时,会进行扩容操作,这是通过定义阈值(threshold)和容量(capacity)来控制的。Java集合框架通过不断的实践改进...

    Java-Java集合体系-List-Set

    添加元素(add)时会自动排序,同时提供了lower/upper/greatest/lesser等方法来处理有序集合的边界元素。 五、Map接口 Map接口与List和Set不同,它用于存储键值对。HashMap和TreeMap是Map接口的常见实现,HashMap提供...

    java中集合排序

    本文将深入探讨Java中集合排序的相关知识点,包括基本概念、排序方法以及常用类的实现。 1. **集合接口与实现** Java集合框架主要包括`List`, `Set`, 和 `Map`三大接口。其中,`List`接口要求元素有序,允许重复;...

    【IT十八掌徐培成】Java基础第11天-02.Map集合-hash原理.zip

    在本课程“【IT十八掌徐培成】Java基础第11天-02.Map集合-hash原理”中,将深入探讨Map集合以及其背后的哈希原理。 Map接口不继承Collection接口,而是独立的一类数据结构,其核心方法包括put()用于添加键值对,get...

    Java集合排序及java集合类详解

    ### Java集合排序及Java集合类详解 #### 一、集合框架概述 集合框架是Java编程语言的核心组件之一,用于组织和操作数据集。它提供了一种灵活的数据结构,支持多种类型的容器,包括列表(List)、集(Set)和映射(Map)...

    557.555.JAVA基础教程_集合-TreeMap两种添加方式的使用(557).rar

    Java编程语言中的集合框架是开发过程中不可或缺的一部分,而TreeMap作为集合框架中的一员,它是一种有序的Key-Value存储结构,适用于需要保持插入顺序或按照自然排序的场景。本教程将详细讲解TreeMap的两种主要添加...

    java私塾面试题----JAVA基础3

    垃圾回收是Java的一大特色,它自动管理内存,避免了C/C++中常见的内存泄漏问题。Java的垃圾回收机制主要有以下几种: - **分代复制垃圾回收**:将堆空间分为年轻代和老年代,年轻代又分为Eden区和Survivor区。新...

    java私塾面试题----JAVA代码与编程3

    Java私塾面试题----JAVA代码与编程3涵盖了Java编程中的核心知识点,这些是面试官在评估候选人技术能力时经常会问到的问题。以下是一些关键的知识点解析: 1. **基本语法**:Java是一种强类型、面向对象的语言,面试...

    Java集合排序及java集合类详解(Collection、List、Map、Set)

    ### Java集合排序及java集合类详解 #### 集合框架概述 集合是Java编程语言中非常核心且广泛使用的部分,对于深入理解和高效使用Java语言至关重要。本文将围绕Java集合框架进行详细介绍,包括Collection、List、Set...

    Java-Generics-and-Collections

    根据提供的文件信息,我们可以深入探讨《Java泛型与集合》这本书中的关键知识点。该书由Maurice Naftalin和Philip Wadler合著,并于2007年由O'Reilly Media出版。以下是对该书内容的一个综合概述,旨在帮助读者理解...

    java工具类集合

    Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...

    JAVA中的集合和js中集合

    - **`TreeSet`**:基于红黑树实现的`Set`接口,能够自动排序。 - **`HashMap`**:基于哈希表实现的`Map`接口,提供高效的键值对映射操作。 - **`TreeMap`**:基于红黑树实现的`Map`接口,能够按照键进行排序。 - **`...

    2JAVA编程高级-集合类.pdf

    泛型是Java集合框架中的一个重要特性,它允许编译器检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率和类型安全性。 **泛型的基本用法**: ```java List&lt;String&gt; stringList = new ...

    Java中实现参数名ASCII码从小到大排序(字典序).doc

    `TreeMap`内部使用红黑树数据结构,可以保证插入的元素按照指定的比较器(默认是自然顺序,即ASCII码顺序)自动排序。在本例中,我们创建了一个新的`TreeMap`实例,将原始`map`的键值对复制到其中,这样新`Map`的键...

    java map 集合 排序

    在Java编程语言中,Map集合是一个非常重要的数据结构,它存储键值对,其中每个键都是唯一的。然而,Map默认不保证元素的顺序,如果需要按照特定规则进行排序,我们需要用到特定类型的Map或者手动排序。本文将深入...

    OnJava8-Examples-3.0_soucecode_java_

    《OnJava8-Examples-3.0_soucecode_java_》是基于Java 8的一份源代码库,它对应于《Thinking in Java 5th Edition》这本书中的示例代码。这个压缩包包含了丰富的编程示例,旨在帮助读者深入理解Java 8的新特性以及...

Global site tag (gtag.js) - Google Analytics