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集合框架中,各种集合类型的自动扩容机制是提高性能的关键。当集合的容量不足以容纳更多元素时,会进行扩容操作,这是通过定义阈值(threshold)和容量(capacity)来控制的。Java集合框架通过不断的实践改进...
添加元素(add)时会自动排序,同时提供了lower/upper/greatest/lesser等方法来处理有序集合的边界元素。 五、Map接口 Map接口与List和Set不同,它用于存储键值对。HashMap和TreeMap是Map接口的常见实现,HashMap提供...
本文将深入探讨Java中集合排序的相关知识点,包括基本概念、排序方法以及常用类的实现。 1. **集合接口与实现** Java集合框架主要包括`List`, `Set`, 和 `Map`三大接口。其中,`List`接口要求元素有序,允许重复;...
在本课程“【IT十八掌徐培成】Java基础第11天-02.Map集合-hash原理”中,将深入探讨Map集合以及其背后的哈希原理。 Map接口不继承Collection接口,而是独立的一类数据结构,其核心方法包括put()用于添加键值对,get...
### Java集合排序及Java集合类详解 #### 一、集合框架概述 集合框架是Java编程语言的核心组件之一,用于组织和操作数据集。它提供了一种灵活的数据结构,支持多种类型的容器,包括列表(List)、集(Set)和映射(Map)...
Java编程语言中的集合框架是开发过程中不可或缺的一部分,而TreeMap作为集合框架中的一员,它是一种有序的Key-Value存储结构,适用于需要保持插入顺序或按照自然排序的场景。本教程将详细讲解TreeMap的两种主要添加...
垃圾回收是Java的一大特色,它自动管理内存,避免了C/C++中常见的内存泄漏问题。Java的垃圾回收机制主要有以下几种: - **分代复制垃圾回收**:将堆空间分为年轻代和老年代,年轻代又分为Eden区和Survivor区。新...
Java私塾面试题----JAVA代码与编程3涵盖了Java编程中的核心知识点,这些是面试官在评估候选人技术能力时经常会问到的问题。以下是一些关键的知识点解析: 1. **基本语法**:Java是一种强类型、面向对象的语言,面试...
根据提供的文件信息,我们可以深入探讨《Java泛型与集合》这本书中的关键知识点。该书由Maurice Naftalin和Philip Wadler合著,并于2007年由O'Reilly Media出版。以下是对该书内容的一个综合概述,旨在帮助读者理解...
Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...
- **`TreeSet`**:基于红黑树实现的`Set`接口,能够自动排序。 - **`HashMap`**:基于哈希表实现的`Map`接口,提供高效的键值对映射操作。 - **`TreeMap`**:基于红黑树实现的`Map`接口,能够按照键进行排序。 - **`...
泛型是Java集合框架中的一个重要特性,它允许编译器检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率和类型安全性。 **泛型的基本用法**: ```java List<String> stringList = new ...
`TreeMap`内部使用红黑树数据结构,可以保证插入的元素按照指定的比较器(默认是自然顺序,即ASCII码顺序)自动排序。在本例中,我们创建了一个新的`TreeMap`实例,将原始`map`的键值对复制到其中,这样新`Map`的键...
在Java编程语言中,Map集合是一个非常重要的数据结构,它存储键值对,其中每个键都是唯一的。然而,Map默认不保证元素的顺序,如果需要按照特定规则进行排序,我们需要用到特定类型的Map或者手动排序。本文将深入...
《OnJava8-Examples-3.0_soucecode_java_》是基于Java 8的一份源代码库,它对应于《Thinking in Java 5th Edition》这本书中的示例代码。这个压缩包包含了丰富的编程示例,旨在帮助读者深入理解Java 8的新特性以及...