【JAVA】Map的遍历方式,Node和Entry的关系

第一种

先取出所有的Key,通过Key取出对应的Value

Map map = new HashMap();
Set keyset = map.keySet();
//(1)增强for
for (object key:keyset) {
	System.out.println(key + "-" + map.get(key));
}
//(2)迭代器
Iterator iterator = keyst.iterator();
while (iterator.hasNext()) {
	Object key = iterator.next();
	System.out.println(key + "-" + map.get(key));
}

第二种

把所有的values取出

Map map = new HashMap();
Collection values = map.values();
//(1) 增强for
for (Object value : values) {
	System.out.println(value);
}
//(2) 迭代器
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
	Object value = iterator2.next();
	System.out.println(value);
}

第三种

通过EntrySet 来获取k-v。EntrySet指的是map.entrySet(),其中存放着Map.Entry。Map.Entry对象存放着一组key和value,可以通过getKey和getValue方法获取。

Map map = new HashMap();
Set entrySet = map.entrySet();//EntrySet<Map.Entry<K,V>>
//(1) 增强for
for (Object entry : entrySet) {
	//将entry 转成Map.Entry
	Map.Entry m = (Map.Entry) entry;
	System.out.println(m.getKey() + "-" + m.getValue());
}
//(2) 迭代器
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
	Object entry = iterator3.next();
	//System.out.println(next.getClass());//HashMap$Node -实现-> Map.Entry (getKey,getValue)
	//向下转型Map.Entry
	Map.Entry m = (Map.Entry) entry;
}

注意

  • Map内部存储键值对数据的基础单元其实是Node类型,Node对象作为构建哈希桶或维护链表等数据结构的基本元素。
  • Entry类似于引用了Node的值,给外部提供了不可修改数据的查看方式。Map通常会提供键视图(keySet())、值视图(values())以及键值对视图(entrySet())等方法,这些视图中的元素都必须是不可变的,以防止外部程序对Map内部数据的直接修改。使用Entry作为视图中的元素类型,可以很好地达到这个目的。而Node作为内部可变数据存储结构,不适合直接对外暴露。
  • Entry作为一个临时映射关系数据载体使用,而Node作为内部真正存储键值对数据的基本单元使用。这两个数据结构的分离设计使得Map内部实现和外部使用得以很好地解耦。
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是使用 List 和 Map 实现拓扑排序的 Java 代码,注释已经加上: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TopologicalSort { public static void main(String[] args) { // 构建图,key 为节点,value 为该节点的后继节点列表 Map<Integer, List<Integer>> graph = new HashMap<>(); graph.put(1, new ArrayList<>()); graph.put(2, new ArrayList<>()); graph.put(3, new ArrayList<>()); graph.put(4, new ArrayList<>()); graph.put(5, new ArrayList<>()); graph.get(1).add(2); graph.get(1).add(3); graph.get(2).add(4); graph.get(3).add(4); graph.get(4).add(5); // 拓扑排序,返回排序后的节点列表 List<Integer> sorted = topologicalSort(graph); // 输出排序结果 System.out.println(sorted); } /** * 使用 List 和 Map 实现拓扑排序 * @param graph 待排序的有向图,key 为节点,value 为该节点的后继节点列表 * @return 排序后的节点列表 */ public static List<Integer> topologicalSort(Map<Integer, List<Integer>> graph) { // 统计每个节点的入度 Map<Integer, Integer> inDegree = new HashMap<>(); for (Map.Entry<Integer, List<Integer>> entry : graph.entrySet()) { int node = entry.getKey(); inDegree.putIfAbsent(node, 0); // 初始化节点的入度为 0 for (int successor : entry.getValue()) { inDegree.put(successor, inDegree.getOrDefault(successor, 0) + 1); // 统计后继节点的入度 } } // 将入度为 0 的节点加入队列 List<Integer> queue = new ArrayList<>(); for (Map.Entry<Integer, Integer> entry : inDegree.entrySet()) { if (entry.getValue() == 0) { queue.add(entry.getKey()); } } // 拓扑排序 List<Integer> sorted = new ArrayList<>(); while (!queue.isEmpty()) { int node = queue.remove(0); // 取出队首节点 sorted.add(node); // 将节点加入排序列表 for (int successor : graph.get(node)) { // 遍历后继节点 int newDegree = inDegree.get(successor) - 1; // 将后继节点的入度减 1 inDegree.put(successor, newDegree); if (newDegree == 0) { // 如果后继节点的入度为 0,则加入队列 queue.add(successor); } } } if (sorted.size() != graph.size()) { // 如果排序列表的长度小于节点数,说明图存在环 throw new IllegalArgumentException("The graph contains a cycle"); } return sorted; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值