怎样输出所有单词的词频呢?

来源:7-6 基于链表的映射实现

一个很坏的好人

2018-08-07

我尝试着这样实现

public static void main(String args[]) {
   System.out.println("pride and prejudice");
   ArrayList<String>words = new ArrayList<String>();
   if (FileOperation.readFile("pride-and-prejudice.txt",words)){
      System.out.println("Total words : " + words.size());
      LinkedListMap<String ,Integer> map = new LinkedListMap<String, Integer>();
      for (String word :words){
         if (map.contains(word)){
            map.set(word,map.get(word)+1);
         }
         else {
            map.add(word,1);
         }
      }
      while (map.dummyNode.next!=null){
         System.out.println(map.dummyNode.next.key + ": " + map.dummyNode.next.value);
         map.dummyNode = map.dummyNode.next;
      }
   }

}

虽然可以输出结果,但是改变了map的dummyNode,我觉得是不对的

我想加一个

Node cur = dummyNode.next;

但是Node是内部类,不让我使用

 请问老师该怎么解决

写回答

2回答

liuyubobobo

2018-08-07

赞问题!


在我们的设计中,并没有给出一个遍历我们数据结构的方式,所以,我们的设计是不完整的,这个课程的目的并非是要设计一个完整可用的数据结构标准库,而是让同学们理解数据结构的底层运行机理。(虽然在这个课程中我们的代码具有足够的形成完整可用的数据结构标准库的潜力,但还是差很多:)


在正规的标准库中,容器类的可遍历的特性是被迭代器所承载的。在我们这个课程中,我完全没有引入迭代器的概念。简而言之,迭代器做的事情就是每次为你取出容器类中的一个元素,然后自动指向下一个元素等着你的下次调用。所谓的迭代:)


更多和迭代器相关的内容,超出了这个课程的范畴,f可以上网进行搜索自学。无论是Java, C++还是Python的标准库设计(近乎所有语言的标准库设计),都需要使用迭代器的概念。如果有兴趣,可以为我们这个课程中的近乎所有的数据结构,提供迭代器:)


P.S. 我的《算法与数据结构》课程,设计图结构的时候,对于遍历每一个节点的邻边,使用了迭代器的概念。有兴趣可以参考:)


加油!

0
1
一个很坏的好人
非常感谢!
2018-08-07
共1条回复

一个很坏的好人

提问者

2018-08-07

转载

/***
 * Map类的一些简单操作
 * 包括TreeMap的排序,HashMap的排序,四种遍历方式
 * @author Administrator
 *
 */
public class MapTest {
	public static void main(String[] args) {
		//创建map对象,并赋值
		
		Map<String,String> treeMap = new TreeMap<String,String>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
		});
		
		treeMap.put("sufow1", "舒泉1");
		treeMap.put("sufow2", "舒泉2");
		treeMap.put("sufow3", "舒泉3");
		treeMap.put("sufow4", "舒泉4");
		treeMap.put("sufow5", "舒泉5");
		treeMap.put("sufow6", "舒泉6");
		treeMap.put("sufow7", "舒泉7");
		
		System.out.println("TreeMap");
		
		//遍历map 方式一,根据keyset方法获取所有的key,再根据key获取值
		for(String str :treeMap.keySet()){
			String val = treeMap.get(str);
			System.out.println(val);
		}
		
		Map<String,String> hashMap = new HashMap<String ,String>();
		
		
		hashMap.put("sufow1", "舒泉1");//可以写入null值
		hashMap.put("sufow2", "舒泉2");
		hashMap.put("sufow3", "舒泉3");
		hashMap.put("sufow4", "舒泉4");
		hashMap.put("sufow5", "舒泉5");
		hashMap.put("sufow6", "舒泉6");
		hashMap.put("sufow7", "舒泉7");
		
		System.out.println("HashMap");
		
		//先排序
		
		List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(hashMap.entrySet());
		
		//通过比较器来排序
		Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
			@Override
			public int compare(Entry<String, String> o1,
					Entry<String, String> o2) {
				return o1.getValue().compareTo(o2.getValue());
			}
		});
		
		//遍历List,第二种通过Map.Entry
		for(Map.Entry<String, String> m :list){
			String val =  m.getValue();
			System.out.println(val);
		}
		
		//第二种遍历map的方式,根据迭代器Iterator
		Iterator<Map.Entry<String, String>> iterator = hashMap.entrySet().iterator();
		
		while(iterator.hasNext()){
			Map.Entry<String, String> map = iterator.next();
			System.out.println(map.getKey());
			System.out.println(map.getValue());
		}
		
		//第三种通过values,只能遍历value
		for(String str:hashMap.values()){
			System.out.println(str);
		}
		
		
		//第四种,通过Map.Entry
		for(Map.Entry<String, String> map:hashMap.entrySet()){
			System.out.println(map.getKey());
			System.out.println(map.getValue());
		}
	}
0
1
一个很坏的好人
总结 (1)map排序的两种方式 第一种:通过 new Comparator的接口,实现方法,进行排序。 第二种:先将Map转换成List , 通过Collections的sort方法进行排序。 (2)Map的四种遍历方式 第一种:通过Map的keySet()方法遍历。 第二种:通过Map的values()方法遍历。 第三种:通过Map的entrySet()方法的Iterator方法将转换成Iterator。通过迭代器遍历。 第四种:通过Map的entrySet()方法,将其转换成Map.Entry对象,在通过foreach遍历,通过Map.Entry对象的getValue()获取值。
2018-08-07
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程