如何在 Java 中迭代 HashTable?
HashTable 是一种基本数据结构,它根据键哈希码进行操作,而不保留插入顺序。它禁止重复的键,但允许重复的值。
值得注意的是,它可容纳各种键和值对象,从而促进异构性。但是,不允许键和值为空,因为这样做会导致名为 NullPointerException 的 RunTimeException。
就接口而言,HashTable 实现了可序列化和可克隆接口,但未能实现 RandomAccess 接口。
此外,HashTable 中的所有方法都是同步的,确保 HashTable 对象的线程安全。
当谈到为频繁的搜索操作选择数据结构时,HashTable 是最佳选择。
使用的方法
我们可以通过多种方法迭代哈希表,包括 -
通过枚举接口
借助 keySet() 方法并增强 for 循环
借助 Map 和 Iterator 的 keySet()接口
利用 Map 的 entrySet() 方法和增强的 for 循环
借助 Map 的 entrySet() 方法和 Iterator 接口
利用 Java 8 中的 Iterable.forEach() 方法
方法 1:通过 Enumeration 接口
java.util.Enumeration 接口是一个预定义接口,用于从集合框架内的变量中检索数据。它仅允许向前检索数据,不支持向后遍历。需要注意的是,Enumeration 接口已被迭代器取代。
nextElement()
代码创建一个 Hashtable。然后代码用键值对填充它。然后,它通过键进行迭代,按键的降序顺序打印其对应的值。
算法
步骤 1 - 导入所需的 Java 类:"java.util"和"java.util.Enumeration"。
步骤 2 - 声明一个名为"TLP"的类。
步骤 3 - 在"TLP"类中定义主要方法:public static void main(String[] args)。
步骤 4 - 创建一个名为"ht"的 Hashtable 类的新实例来存储整数键和字符串值。
步骤 5 - 使用 put 将键值对添加到 Hashtable"ht"方法:
步骤 6 - 通过调用 Hashtable"ht"上的 keys() 方法创建一个名为"e"的新枚举对象。
步骤 7 - 输入一个带有条件"e.hasMoreElements()"的 while 循环,以遍历 Hashtable 中的键。
步骤 8 - 在 while 循环中,使用 nextElement() 方法从枚举中检索下一个键并将其分配给变量"key"。
步骤 9 - 将输出消息打印到控制台。您可以使用 System.out.println() 方法执行此操作。
步骤 10 - 终止程序
示例
import java.util.*; import java.util.Enumeration; // Main Class public class TLP { public static void main(String[] args){ Hashtable<Integer, String> ht = new Hashtable<>(); ht.put(1, "Apple"); ht.put(2, "Strawberry"); ht.put(3, "Berry"); ht.put(4, "Guava"); ht.put(5, "Peach"); Enumeration<Integer> e = ht.keys(); while (e.hasMoreElements()) { int key = e.nextElement(); System.out.println("Rank : " + key + "\t\t Name : " + ht.get(key)); } } }
输出
Rank : 5 Name : Peach Rank : 4 Name : Guava Rank : 3 Name : Berry Rank : 2 Name : Strawberry Rank : 1 Name : Apple
方法 2:借助 keySet() 方法并增强 for 循环
keySet()
代码打印存储在 Hashtable 中的国家及其对应的首都,每对都以"国家:[国家] 首都:[首都]"格式显示。国家和首都按照它们添加到 Hashtable 的顺序打印。
算法
步骤 1 - 创建一个名为"ht"的新 Hashtable 对象来存储字符串键和字符串值。
步骤 2 - 使用 put 方法将键值对添加到 Hashtable"ht":
步骤 3 - 使用 keySet() 方法从 Hashtable 获取键集并将其存储在 Set 变量"setOfCountries"中。
步骤 4 - 使用 for-each 循环遍历 Set 中的每个键。
步骤 5 - 在循环内部,将当前键分配给 String 变量"key"。
步骤 6 - 打印输出消息。我们使用 System.out.println() 方法执行此操作
步骤 7 - 结束程序
示例
import java.util.Hashtable; import java.util.Set; public class TLP { public static void main(String[] args) { Hashtable<String, String> ht = new Hashtable<String, String>(); ht.put("India", "Delhi"); ht.put("Russia", "Moscow"); ht.put("Australia", "Canberra"); ht.put("USA", "Washingtin DC"); // getting keySet() into Set Set<String> setOfCountries = ht.keySet(); // for-each loop for(String key : setOfCountries) { System.out.println("Country : " + key + "\t\t Capital : " + ht.get(key)); } } }
输出
Country : USA Capital : Washingtin DC Country : Russia Capital : Moscow Country : India Capital : Delhi Country : Australia Capital : Canberra
方法 3:使用 Map 和 Iterator 接口的 keySet()
hasNext()
代码首先创建一个包含状态及其名称的哈希表。然后,它遍历哈希表并打印每个州及其名称。
算法
步骤 1 - 创建一个名为 ht 的哈希表,并用五个键值对对其进行初始化。
步骤 2 - 获取哈希表的 keySet() 并将其存储在名为 setOfKeys 的集合中。
步骤 3 - 为 setOfKeys 创建一个名为 itr 的迭代器。
步骤 4 - 使用 itr 迭代器循环遍历 setOfKeys:
步骤 5 - 获取集合中的下一个元素,它是一个整数键。
步骤 6 - 从哈希表。
步骤 7 - 打印州和名称。
示例
import java.util.*; import java.util.Iterator; import java.util.Set; public class TLP { // Main driver method public static void main(String[] args){ Hashtable<Integer, String> ht = new Hashtable<>(); ht.put(1, "Telangana"); ht.put(2, "Karnataka"); ht.put(3, "Delhi"); ht.put(4, "Maharashtra"); ht.put(5, "Rajasthan"); Set<Integer> setOfKeys = ht.keySet(); Iterator<Integer> itr = setOfKeys.iterator(); while (itr.hasNext()) { int key = itr.next(); System.out.println("State : " + key + "\t\t Name : " + ht.get(key)); } } }
输出
State : 5 Name : Rajasthan State : 4 Name : Maharashtra State : 3 Name : Delhi State : 2 Name : Karnataka State : 1 Name : Telangana
方法 4:使用 Map 的 entrySet() 方法和增强的 for 循环
while()
给定的代码创建一个 Hashtable,并用表示水果及其对应颜色的键值对填充它。然后它遍历 Hashtable 中的条目并打印每个水果及其相应的颜色。输出按水果和颜色添加到 Hashtable 的顺序显示它们。
算法
步骤 1 - 创建一个名为 ht 的哈希表,并用三个键值对对其进行初始化。
步骤 2 - 获取哈希表的 entrySet()。
步骤 3 - 创建一个遍历 entrySet() 的 for-each 循环。
步骤 4 - 在循环的每次迭代中,获取 entrySet() 中的下一个元素,它是一个 Map.Entry 对象。
步骤 5 - 从 Map.Entry 对象获取水果和颜色。
步骤 6 - 打印水果和颜色。
示例
package in.bench.resources.hashtable.iteration.ways; import java.util.Hashtable; import java.util.Map.Entry; import java.util.Set; public class TLP { public static void main(String[] args) { Hashtable<String, String> ht = new Hashtable<String, String>(); ht.put("Apple", "Red"); ht.put("Guava", "Green"); ht.put("Lychee", "White"); Set<Entry<String, String>> entrySet = ht.entrySet(); for(Entry<String, String> entry1 : entrySet) { System.out.println("Fruit : " + entry1.getKey() + "\t\t Color : " + entry1.getValue()); } } }
输出
Fruit : Guava Color : Green Fruit : Lychee Color : White Fruit : Apple Color : Red
方法 5:借助 Map 和 Iterator 接口的 entrySet() 方法
hasNext()
给定的代码创建一个 Hashtable 并添加表示等级及其对应名称的键值对。然后,它使用迭代器遍历 Hashtable 中的条目,并打印每个等级及其相应的名称。输出结果按键的升序显示排名和名称。
算法
步骤 1 − 创建一个名为 ht 的哈希表,并用五个键值对对其进行初始化。
步骤 2 − 获取哈希表的 entrySet()。
步骤 3 − 为 entrySet() 创建一个名为 itr 的迭代器。
步骤 4 − 使用 itr 迭代器循环遍历 entrySet:
步骤 5 − 获取集合中的下一个元素,即 Map.Entry 对象。
步骤 6 − 从 Map.Entry 获取排名和名称对象。
步骤 7 - 打印排名和姓名。
示例
import java.util.*; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; public class TLP { public static void main(String[] args){ Hashtable<Integer, String> ht = new Hashtable<>(); ht.put(1, "Project Management"); ht.put(2, "Product Management"); ht.put(3, "Software Development"); ht.put(4, "Quality Assurance"); ht.put(5, "Product Strategy"); Set<Entry<Integer, String> > entrySet = ht.entrySet(); Iterator<Entry<Integer, String> > itr = entrySet.iterator(); while (itr.hasNext()) { Entry<Integer, String> entry = itr.next(); System.out.println("Rank : " + entry.getKey() + "\t\t Name : " + entry.getValue()); } } }
输出
Rank : 5 Name : Product Strategy Rank : 4 Name : Quality Assurance Rank : 3 Name : Software Development Rank : 2 Name : Product Management Rank : 1 Name : Project Management
方法 6:利用 Java 8 中的 Iterable.forEach() 方法
forEach()
给定的代码创建一个 Hashtable 并添加表示联邦属地及其相应名称的键值对。然后,它使用 forEach 方法遍历 Hashtable 中的条目,并打印每个联邦属地及其相应的名称。输出按添加到哈希表的顺序显示联邦属地和名称。
算法
步骤 1 - 创建一个名为 ht 的哈希表,并使用三个键值对对其进行初始化。
步骤 2 - 使用 forEach() 方法遍历哈希表。
步骤 4 - 从哈希表中获取键和值。
步骤 5 - 打印联邦属地和名称。
示例
import java.util.Hashtable; public class TLP { public static void main(String[] args) { Hashtable<String, String> ht = new Hashtable<String, String>(); ht.put("1", "Lakshadweep"); ht.put("2", "Delhi"); ht.put("3", "Pondicherry"); ht.forEach((key, value)->System.out.println("Union Territory : " + key + "\t\t" + "Name : " + value)); } }
输出
Union Territory : 1 Name : Lakshadweep Union Territory : 2 Name : Delhi Union Territory : 3 Name : Pondicherry
结论
Java 中有多种方法可以遍历 Hashtable。从 Enumeration 接口的使用、带有增强 for 循环的 keySet() 方法、带有 Iterator 接口的 keySet() 方法,到带有增强 for 循环的 entrySet() 方法、带有 Iterator 接口的 entrySet() 方法以及 Iterable,我们已经全部讨论了。
Java 8 中引入了 forEach() 方法。每种方法都可以根据特定需求灵活、方便地遍历 Hashtable。