如何在Java中迭代HashTable?


HashTable 是一个基本的数据结构,它基于键的哈希码进行操作,并且不保留插入顺序。它不允许重复的键,但允许重复的值。

值得注意的是,它可以容纳键和值各种各样的对象,从而促进异构性。但是,不允许键和值为 null,因为这样做会导致一个名为 NullPointerException 的运行时异常。

在接口方面,HashTable实现了可序列化和可克隆接口,但它没有实现 RandomAccess 接口。

此外,HashTable 中的所有方法都是同步的,确保了 HashTable 对象的线程安全。

当需要选择一个数据结构来执行频繁的搜索操作时,HashTable 是最佳选择。

使用的方法

我们可以通过多种方法迭代哈希表,包括:

  • 通过 Enumeration 接口

  • 借助 keySet() 方法和增强型 for 循环

  • 借助 Map 的 keySet() 方法和 Iterator 接口

  • 利用 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" 类中定义 main 方法:public static void main(String[] args)。

  • 步骤 4 - 创建一个名为 "ht" 的 Hashtable 类的新实例,用于存储整型键和字符串值。

  • 步骤 5 - 使用 put 方法将键值对添加到 Hashtable "ht" 中

  • 步骤 6 - 通过在 Hashtable "ht" 上调用 keys() 方法创建一个名为 "e" 的新 Enumeration 对象。

  • 步骤 7 - 使用条件 "e.hasMoreElements()" 进入 while 循环,以迭代 Hashtable 中的键。

  • 步骤 8 - 在 while 循环中,使用 nextElement() 方法从 Enumeration 中检索下一个键,并将其分配给变量 "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 的 keySet() 方法和 Iterator 接口

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 - 创建一个 for-each 循环,迭代 entrySet()。

  • 步骤 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 的 entrySet() 方法和 Iterator 接口

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 中的条目,并打印每个联盟领土及其对应的名称。输出按添加到 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 接口、keySet() 方法与增强型 for 循环、keySet() 方法与 Iterator 接口、到 entrySet() 方法与增强型 for 循环、entrySet() 方法与 Iterator 接口以及 Iterable,我们都已讨论过。

Java 8 中引入了 forEach() 方法。每种方法都提供了根据特定需求遍历 Hashtable 的灵活性和便利性。

更新于: 2023年10月19日

2K+ 阅读量

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告