gpt4 book ai didi

Java Comparator在 SortedMap中使用

转载 作者:知者 更新时间:2024-03-12 08:01:08 27 4
gpt4 key购买 nike

Java Comparator 可用于控制 SortedMap 数据结构的键的顺序。 SortedMap 的实现类是 TreeMapConcurrentSkipListMap。我们可以将 Comparator 实例传递给 TreeMapConcurrentSkipListMap 类的构造函数来控制其键的顺序。 SortedMap 提供了 comparator() 方法,该方法返回用于对该映射中的键进行排序的比较器。如果 SortedMap 使用关键元素的自然排序,则 comparator() 方法返回 null。在此页面上,我们将提供示例以将比较器与 TreeMapConcurrentSkipListMap 类一起使用。

Comparator 与 TreeMap

TreeMap 根据其键的自然顺序排序,或者通过在地图创建时提供的比较器进行排序,具体取决于使用的构造函数。我们可以通过使用以下构造函数传递 Comparator 来实例化 TreeMap 类。

TreeMap(Comparator<? super K> comparator)

它构造一个新的空树映射,根据给定的比较器排序。当我们不通过比较器时,TreeMap 将键排序为其自然顺序。对于自然排序,元素类需要实现 Comparable 接口并覆盖 compareTo 方法。
为了获得我们的 TreeMap 对象使用的比较器,SortedMap 提供了 comparator() 方法。
现在找到使用带有 TreeMap 类的比较器来控制其键的顺序的示例。
TreeMapDemo.java

package com.concretepage;
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMapDemo {
  public static void main(String[] args) {
	Student s1 = new Student("Shyam", 18);
	Student s2 = new Student("Mohan", 20);
	Student s3 = new Student("Ram", 22);
	
	System.out.println("---TreeMap Order With Comparator---");
	
	Comparator<Student> ageComparator = Comparator.comparing(Student::getAge);
	TreeMap<Student, String> myTreeMap = new TreeMap<>(ageComparator);
	myTreeMap.put(s1, "Varanasi");
	myTreeMap.put(s2, "Mathura");
	myTreeMap.put(s3, "Kashi");	
	myTreeMap.forEach((k, v) -> System.out.println(k + " - " + v));	
	//System.out.println("Comparator: "+ myTreeMap.comparator());
	
	System.out.println("---TreeMap Natural Order (With Comparable)---");
	
	myTreeMap = new TreeMap<>();
	myTreeMap.put(s1, "Varanasi");
	myTreeMap.put(s2, "Mathura");
	myTreeMap.put(s3, "Kashi");	
	myTreeMap.forEach((k, v) -> System.out.println(k + " - " + v));	
  }
}

Student.java

package com.concretepage;
public class Student implements Comparable<Student> {
  private String name;
  private int age;
  public Student(String name, int age) {
	this.name = name;
	this.age = age;
  }
  public String getName() {
	return name;
  }
  public int getAge() {
	return age;
  }
  @Override
  public int compareTo(Student s) {
	return name.compareTo(s.getName());
  }
  @Override  
  public String toString(){
	return name + "-" + age; 
  }
}

输出

---TreeMap Order With Comparator---
Shyam-18 - Varanasi
Mohan-20 - Mathura
Ram-22 - Kashi
---TreeMap Natural Order (With Comparable)---
Mohan-20 - Mathura
Ram-22 - Kashi
Shyam-18 - Varanasi

Comparator 与 ConcurrentSkipListMap

ConcurrentSkipListMap 是根据其键的自然顺序排序的,或者通过在地图创建时提供的比较器进行排序,具体取决于使用的构造函数。我们可以通过使用以下构造函数传递 Comparator 来实例化 ConcurrentSkipListMap 类。

ConcurrentSkipListMap(Comparator<? super K> comparator)

它构造一个新的空映射,根据给定的比较器排序。当我们不通过比较器时,ConcurrentSkipListMap 将键排序为其自然顺序。对于自然排序,元素类需要实现 Comparable 接口并覆盖 compareTo 方法。
为了获得我们的 ConcurrentSkipListMap 对象使用的比较器,SortedMap 提供了 comparator() 方法。
现在找到使用带有 ConcurrentSkipListMap 类的比较器来控制其键顺序的示例。
ConcurrentSkipListMapDemo.java

package com.concretepage;
import java.util.Comparator;
import java.util.concurrent.ConcurrentSkipListMap;
public class ConcurrentSkipListMapDemo {
  public static void main(String[] args) {
	Student s1 = new Student("Shyam", 18);
	Student s2 = new Student("Mohan", 20);
	Student s3 = new Student("Ram", 22);
	
	System.out.println("---ConcurrentSkipListMap Order With Comparator---");
	
	Comparator<Student> ageComparator = Comparator.comparing(Student::getAge);
	ConcurrentSkipListMap<Student, String> myConcurrentSkipListMap = new ConcurrentSkipListMap<>(ageComparator);
	myConcurrentSkipListMap.put(s1, "Varanasi");
	myConcurrentSkipListMap.put(s2, "Mathura");
	myConcurrentSkipListMap.put(s3, "Kashi");	
	myConcurrentSkipListMap.forEach((k, v) -> System.out.println(k + " - " + v));	
	//System.out.println("Comparator: "+ myConcurrentSkipListMap.comparator());
	
	System.out.println("---ConcurrentSkipListMap Natural Order (With Comparable)---");
	
	myConcurrentSkipListMap = new ConcurrentSkipListMap<>();
	myConcurrentSkipListMap.put(s1, "Varanasi");
	myConcurrentSkipListMap.put(s2, "Mathura");
	myConcurrentSkipListMap.put(s3, "Kashi");	
	myConcurrentSkipListMap.forEach((k, v) -> System.out.println(k + " - " + v));	
  }
}

输出

---ConcurrentSkipListMap Order With Comparator---
Shyam-18 - Varanasi
Mohan-20 - Mathura
Ram-22 - Kashi
---ConcurrentSkipListMap Natural Order (With Comparable)---
Mohan-20 - Mathura
Ram-22 - Kashi
Shyam-18 - Varanasi

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com