使用 Java 中的 Comparable 接口对 LinkedHashMap 按值排序


LinkedHashMap 是一个泛型类,用于实现 Map 接口。它也是 HashMap 类的子类,因此可以使用所有方法并执行 HashMap 类能够执行的类似操作。

Java 提供了多种对 LinkedHashMap 进行排序的方法,本文将学习如何使用 Comparable 接口创建并按其值对其进行排序。

按值对 LinkedHashMap 排序的程序

在直接跳转到排序程序之前,让我们先了解一些概念:

LinkedHashMap

正如我们之前讨论的那样,LinkedHashMap 类扩展 HashMap 类以实现 Map 接口。它维护键值对。键是一个用于获取和接收与其关联的值的对象。它以 LinkedList 的形式存储映射的元素,并按照插入的顺序存储,即它维护元素的插入顺序。此外,每当我们返回其元素时,它将按插入顺序打印。

LinkedHashMap 的通用语法如下:

语法

LinkedHashMap< TypeOfKey, TypeOfValue > nameOfMap = new LinkedHashMap<>();

在上述语法中,

TypeOfKey - 指定键的数据类型。

TypeOfValue - 指定要存储在映射中的值的数据类型。

nameOfMap - 为映射提供一个合适的名称。

Comparable 接口

Java 提供了各种排序算法和方法,可以帮助我们对数组、列表或任何集合进行排序。Comparable 接口是一种额外的方式,当我们想要按其自然顺序对自定义对象进行排序时很有用。例如,它按字典顺序对字符串进行排序,按数字顺序对数字进行排序。此接口位于“java.lang”包中。

语法

class nameOfclass implements Comparable<nameOfclass>

compareTo() 方法

Comparable 接口仅定义了一个名为“CompareTo”的方法,可以覆盖该方法以对对象集合进行排序。它赋予了将类的对象与其自身进行比较的能力。当“this”对象等于传递的对象时,它返回 0;如果“this”对象大于传递的对象,则返回正值;否则返回负值。

语法

compareTo(nameOfclass nameOfobject); 

Collections.sort() 方法

Collection 接口的“Collections”类提供了一个名为“Collections.sort()”的静态方法,该方法可以对指定集合(如 ArrayList 或 LinkedList)的元素进行排序。它位于“java.util”包中。

语法

Collections.sort(nameOfcollection);

算法

  • 步骤 1 - 创建一个实现 Comparable 接口的类“Cart”。在其中,声明两个变量并定义此类的构造函数以及两个参数“item”和“price”,类型分别为字符串和双精度浮点数。

  • 步骤 2 - 接下来,我们将使用“toString()”方法将对象的数据转换为字符串。然后,定义“compareTo”方法以及一个作为参数的“Cart”类对象,以将“this”对象与新创建的对象进行比较。

  • 步骤 3 - 现在,在 main() 方法中,声明一个名为“obj”的 LinkedHashMap 类“Cart”对象,并使用名为“put()”的内置方法将对象的详细信息存储到其中。“item”是键,其对应值是“price”。

  • 步骤 4 - 最后,定义一个名为“SrtList”的 ArrayList 集合,以存储 LinkedHashMap 的排序元素。现在,将“obj”作为参数传递给“Collections.sort()”方法,以按值执行排序操作。

示例

import java.util.*;
import java.lang.*;
public class Cart implements Comparable<Cart> {
   String item;
   double price;
   Cart(String item, double price) {
      // this keyword shows these variables belongs to constructor
      this.item = item; 
      this.price = price;
   }
   // method for converting object into string
   public String toString() {
      return "Item: " + item + ", " + "Price: " + price;
   }
   public String getName() { 
      // to retrieve item name
      return this.item;
   }
   // overriding method
   public int compareTo(Cart comp) {
      if(this.price > comp.price) {
         return 1;
      } else {
         return -1;
      }
   }
   public static void main(String[] args) {
      // Declaring collection LinkedHashMap
      LinkedHashMap<String, Cart> obj = new LinkedHashMap<>();
      // Adding object to the obj map
      Cart obj1 = new Cart("Rice", 59);
      obj.put(obj1.getName(), obj1);
      Cart obj2 = new Cart("Milk", 60);
      obj.put(obj2.getName(), obj2);
      Cart obj3 = new Cart("Bread", 45);
      obj.put(obj3.getName(), obj3);
       // printing details obj map in unsorted order
      System.out.println("Elements of the map: ");
      for (String unKey : obj.keySet()) {
         System.out.println(obj.get(unKey));
      }
      List<Cart> SrtList = new ArrayList<>(obj.values());
      Collections.sort(SrtList); 
      // Sorting the object
      // printing details of obj map in sorted order
      System.out.println("Elements of the newly sorted map: ");
      System.out.println(SrtList);
   }
}

输出

Elements of the map: 
Item: Rice, Price: 59.0
Item: Milk, Price: 60.0
Item: Bread, Price: 45.0
Elements of the newly sorted map: 
[Item: Bread, Price: 45.0, Item: Rice, Price: 59.0, Item: Milk, Price: 60.0]

结论

在 Java 1.0 版本中,Comparable 接口首次引入并可在“java.lang”包中使用。在本文中,我们探讨了 LinkedHashMap 以及 Comparable 接口在排序操作中的使用。

更新于:2023 年 5 月 15 日

319 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告