今天非常高兴,解决了一个由来已久的单词出现频率统计问题。以及容器浅总结


总述:人与动物的最大区别在于对工具的使用。也许你单独的能力不怎么样,但是当你使用了恰当的工具并对周边的相关资源进行了优化配置,那么你不一定是战无不胜的,但至少你会攻无不克。O(∩_∩)O~

由于一直用到容器,每次都用起来很陌生不上手,最近有遇到了,我觉得很有必要把这个家伙干掉了。所以专门拿了一段时间来搞定容器这部分。
参考资料:《ThinkingInJava》
精彩文摘:
1.   即使在Java没有直接的关键字支持,容器类仍旧是可以显著增强你的编程能力的基本工具。   2.  Set:能够产生每个元素都唯一的列表时相当有用的功能。  3.  Map:将对象映射到其它对象的能力是一种解决编程问题的杀手锏。  4.  Map:  Map与数组和其他的容器一样,可以很容易地扩展到多维,而我们只需将其值设置为Map(这些Map的值可以是其它容器,甚至是其它Map),因此我们能够很容易的将容器组合起来从而快速的生成强大的数据结构。  5.  使用接口描述的一个理由是它可以使我们能够创建更通用的大妈,通过针对接口而非具体实现来编写代码,我们的代码可以应用于更多的对象类型。 6.  Java SE5的重大变化之一:泛型的概念:适用于广泛的类型。  7.  根据我的经验,理解了边界所在你才能成为编程高手,因为只有你知道了某个技术不能做到什么,你才能更好的做到所能做到的。
8.  更多精彩精在ThinkingInJava



下面来看看这个单词频率统计的问题吧。虽然这个问题不关乎生死,但是都没有很好的解决过,当然我确定今天这里的解决办法依然不是一个好的办法,但是就像我的总述所说:至少对工具的使用让我找到了一种解决问题的方法吧。

具体代码:

package mapApp;

import java.util.*;

public class SortValue {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str[] = "java java platform is is is is perfect".split(" ");
		statistics(str);
	}

	public static void statistics(String str[]) {
		Map<String, Integer> m = new HashMap<String, Integer>();// TreeMap输出是有序的
		for (int i = 0; i < str.length; i++) {
			Integer freq = m.get(str[i]);
			m.put(str[i], freq == null ? 1 : freq + 1);
		}
		// 把Map以键值对的形式存入一个可以排序的TreeSet中去
		Set<WorkForMap> set = new TreeSet<WorkForMap>();
		for (String s : m.keySet()) {
			set.add(new WorkForMap(s, m.get(s)));
		}
		System.out.println("输出形式一:");
		System.out.println(set);

		// 上面的输出显然不是我们需要的噻,那么让我们来改变一种输出方式吧!
		System.out.println("输出形式二:");
		for (Iterator<WorkForMap> it = set.iterator(); it.hasNext();) {
			WorkForMap w = it.next();
			System.out.println("单词:" + w.str + " 出现的次数为: " + w.freq);
		}
		// 当然我们可以控制只输出前三名来
		System.out.println("输出形式三:");
		int count = 1;
		for (Iterator<WorkForMap> it = set.iterator(); it.hasNext();) {
			WorkForMap w = it.next();
			System.out.println("第" + count + "名为单词:" + w.str + " 出现的次数为: "
					+ w.freq);
			if (count == 3)// 当输出3个后跳出循环
				break;
			count++;
		}
	}
}
public class WorkForMap implements Comparable<WorkForMap> {
	String str;
	Integer freq;

	public WorkForMap(String str, Integer freq) {
		this.str = str;
		this.freq = freq;
	}

	public int compareTo(WorkForMap o) {
		int cmp = freq.intValue() - o.freq.intValue();
		return (cmp == 0 ? str.compareTo(o.str) : -cmp);
		//只需在这儿加一个负号就可以决定是升序还是降序排列
		//因为TreeSet会调用WorkForMap的compareTo方法来决定自己的排序
	}

	@Override
	//因为当我们print的时候,print会调用WorkForMap的toString方法来决定自己的输出
	//我们当然可以按照自己的方式来显示输出啦
	public String toString() {
		return str + "出现的次数为:" + freq;
	}
}
输出结果:
输出形式一:
[is出现的次数为:4, java出现的次数为:2, perfect出现的次数为:1, platform出现的次数为:1]
输出形式二:
单词:is 出现的次数为: 4
单词:java 出现的次数为: 2
单词:perfect 出现的次数为: 1
单词:platform 出现的次数为: 1
输出形式三:
第1名为单词:is 出现的次数为: 4
第2名为单词:java 出现的次数为: 2
第3名为单词:perfect 出现的次数为: 1

今天非常高兴,解决了一个由来已久的单词出现频率统计问题。以及容器浅总结_第1张图片



.

你可能感兴趣的:(数据结构,编程)