ใน Java ฉันมีและฉันต้องการที่จะทำให้มันกลายเป็นที่เรียงลำดับSet
List
มีวิธีในjava.util.Collections
แพ็คเกจที่จะทำสิ่งนี้ให้ฉันหรือไม่?
ใน Java ฉันมีและฉันต้องการที่จะทำให้มันกลายเป็นที่เรียงลำดับSet
List
มีวิธีในjava.util.Collections
แพ็คเกจที่จะทำสิ่งนี้ให้ฉันหรือไม่?
คำตอบ:
คำตอบที่ได้จาก OPไม่ดีที่สุด มันเป็นความไม่มีประสิทธิภาพที่จะสร้างใหม่List
และอาร์เรย์ใหม่ที่ไม่จำเป็น นอกจากนี้ยังเพิ่มคำเตือน "ไม่ถูกตรวจสอบ" เนื่องจากปัญหาด้านความปลอดภัยประเภทรอบ ๆ อาร์เรย์ทั่วไป
ให้ใช้บางสิ่งเช่นนี้แทน:
public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
List<T> list = new ArrayList<T>(c);
java.util.Collections.sort(list);
return list;
}
นี่คือตัวอย่างการใช้งาน:
Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);
Util
คลาสนี้เป็นคลาสที่มีasSortedList()
วิธีการที่ฉันเขียน คุณเขียนUtil
ชั้นเรียนด้วยตัวเองแล้วใส่รหัสนั้นลงไป
ชุดเรียง:
return new TreeSet(setIWantSorted);
หรือ:
return new ArrayList(new TreeSet(setIWantSorted));
Set
อย่างไร
new TreeSet
ยอมรับCollection
ว่าไม่ใช่แค่Set
s ไม่ใช่ทุกคนที่อ่านคำตอบนี้จะใช้ a Set
ถึงแม้ว่านั่นคือสิ่งที่คำถามเดิมถาม
List myList = new ArrayList(collection);
Collections.sort(myList);
... ควรทำอย่างไร เพิ่มรสชาติด้วย Generics ถ้ามี
Comparable
และแทนที่compareTo
เมธอดได้เสมอ
นี่คือวิธีที่คุณสามารถทำได้ด้วย Streams ของ Java 8:
mySet.stream().sorted().collect(Collectors.toList());
หรือด้วยเครื่องมือเปรียบเทียบที่กำหนดเอง:
mySet.stream().sorted(myComparator).collect(Collectors.toList());
ปลอดภัยเสมอที่จะใช้ตัวเปรียบเทียบหรืออินเทอร์เฟซที่เปรียบเทียบได้เพื่อจัดให้มีการดำเนินการเรียงลำดับ (ถ้าวัตถุไม่ใช่คลาส String หรือ Wrapper สำหรับชนิดข้อมูลดั้งเดิม) เป็นตัวอย่างสำหรับการใช้งานเครื่องมือเปรียบเทียบเพื่อเรียงลำดับพนักงานตามชื่อ
List<Employees> empList = new LinkedList<Employees>(EmpSet);
class EmployeeComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
}
Collections.sort(empList , new EmployeeComparator ());
เครื่องมือเปรียบเทียบมีประโยชน์เมื่อคุณจำเป็นต้องมีอัลกอริทึมการเรียงลำดับที่แตกต่างกันในวัตถุเดียวกัน (พูดชื่อ EMP เงินเดือน EMP ฯลฯ ) การเรียงลำดับโหมดเดียวสามารถทำได้โดยใช้อินเตอร์เฟสที่สามารถเปรียบเทียบได้กับวัตถุที่ต้องการ
ไม่มีวิธีการเดียวที่จะทำเช่นนั้นได้ ใช้สิ่งนี้:
@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
T[] array = collection.toArray(
(T[])new Comparable[collection.size()]);
Arrays.sort(array);
return Arrays.asList(array);
}
คุณสามารถแปลงชุดเป็นArrayList
ที่ที่คุณสามารถจัดเรียงโดยใช้ArrayList
Collections.sort(List)
นี่คือรหัส:
keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);
Collections.sort(list);
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);
list.addAll(sortedset);
โดย originalset = ชุดที่ไม่เรียงลำดับและ list = รายการที่จะส่งคืน
@ Jeremy Stein ฉันต้องการใช้รหัสเดียวกัน เช่นกันฉันต้องการเรียงลำดับ set เป็น list ดังนั้นแทนที่จะใช้ Set I แปลงค่า set เป็น List และเรียงลำดับรายการโดยเป็นตัวแปรตัวเดียว รหัสนี้ช่วยฉัน
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
ฉันใช้รหัสนี้ซึ่งฉันพบว่ามีประโยชน์มากกว่าคำตอบที่ยอมรับด้านบน:
List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));