ฉันมีList<String>
วัตถุที่มีชื่อประเทศ ฉันจะเรียงลำดับรายการตามลำดับตัวอักษรได้อย่างไร
ฉันมีList<String>
วัตถุที่มีชื่อประเทศ ฉันจะเรียงลำดับรายการตามลำดับตัวอักษรได้อย่างไร
คำตอบ:
สมมติว่าเป็น Strings ใช้วิธี static ที่สะดวกsort
...
java.util.Collections.sort(listOfCountryNames)
หากคุณถูกบังคับให้ใช้รายการนั้นหรือหากโปรแกรมของคุณมีโครงสร้างเช่นนั้น
จากนั้นคำตอบของ Thilos จะเป็นวิธีที่ดีที่สุดที่จะทำ หากคุณรวมเข้ากับคำแนะนำจากTom Hawtin - tacklineคุณจะได้รับ:
java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
หากคุณมีอิสระในการตัดสินใจและหากแอปพลิเคชันของคุณอาจมีความซับซ้อนมากขึ้นคุณอาจเปลี่ยนรหัสของคุณเพื่อใช้ TreeSet แทน คอลเล็กชันประเภทนี้เรียงลำดับรายการของคุณเมื่อแทรก ไม่จำเป็นต้องโทรหา sort ()
Collection<String> countryNames =
new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.
สิ่งนี้มีข้อดีบางอย่างที่สำคัญ แต่สำคัญ:
TreeSet<String> countyNames
และทันทีที่รู้: นี้เป็นคอลเลกชันที่เรียงลำดับของสายได้โดยไม่ซ้ำกันและผมสามารถมั่นใจได้ว่าเป็นความจริงทุกขณะ ข้อมูลมากมายในการประกาศสั้น ๆการใช้คอลเล็กชันที่เหมาะสมสำหรับงานที่ถูกต้องเป็นกุญแจสำคัญในการเขียนโค้ดแบบสั้นและปราศจากข้อบกพร่อง มันไม่ได้เป็นตัวอย่างในกรณีนี้เพราะคุณเพิ่งบันทึกหนึ่งบรรทัด แต่ฉันหยุดนับบ่อยครั้งที่ฉันเห็นใครบางคนที่ใช้รายการเมื่อพวกเขาต้องการตรวจสอบให้แน่ใจว่าไม่มีรายการซ้ำแล้วสร้างฟังก์ชันการทำงานนั้นเอง หรือแย่กว่านั้นคือใช้สองรายการเมื่อคุณต้องการแผนที่จริงๆ
อย่าเข้าใจฉันผิด: การใช้ Collections.sort ไม่ใช่ข้อผิดพลาดหรือมีข้อบกพร่อง แต่มีหลายกรณีเมื่อ TreeSet สะอาดกว่ามาก
คุณสามารถสร้างสำเนาที่เรียงลำดับใหม่โดยใช้ Java 8 Stream หรือ Guava:
// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names);
อีกทางเลือกหนึ่งคือการจัดเรียงในสถานที่ผ่าน Collections API:
Collections.sort(names);
มาสายดีกว่าไม่มาเลย! นี่คือวิธีที่เราทำได้ (เพื่อการเรียนรู้เท่านั้น) -
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class SoftDrink {
String name;
String color;
int volume;
SoftDrink (String name, String color, int volume) {
this.name = name;
this.color = color;
this.volume = volume;
}
}
public class ListItemComparision {
public static void main (String...arg) {
List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
softDrinkList .add(new SoftDrink("Fanta", "ColorTwo", 3));
softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));
softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));
Collections.sort(softDrinkList, new Comparator() {
@Override
public int compare(Object softDrinkOne, Object softDrinkTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((SoftDrink)softDrinkOne).name
.compareTo(((SoftDrink)softDrinkTwo).name);
}
});
for (SoftDrink sd : softDrinkList) {
System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
}
Collections.sort(softDrinkList, new Comparator() {
@Override
public int compare(Object softDrinkOne, Object softDrinkTwo) {
//comparision for primitive int uses compareTo of the wrapper Integer
return(new Integer(((SoftDrink)softDrinkOne).volume))
.compareTo(((SoftDrink)softDrinkTwo).volume);
}
});
for (SoftDrink sd : softDrinkList) {
System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
}
}
}
ในหนึ่งบรรทัดโดยใช้ Java 8:
list.sort(Comparator.naturalOrder());
Collections.sort
ใช้สองอาร์กิวเมนต์สำหรับการของ คุณจะต้องการที่เหมาะสมComparator
ว่ากรณีการปฏิบัติที่เหมาะสม (เช่นไม่คำศัพท์ไม่ UTF16 การสั่งซื้อ) java.text.Collator.getInstance
เช่นที่ผ่านพอใช้ได้
Collator
จนกว่าคุณจะได้เรียงลำดับสตริงในสำเนียงฟรีภาษาอังกฤษเท่านั้นคุณอาจต้องการที่จะใช้งาน มันจะถูกจัดเรียงเครื่องหมายกำกับอย่างถูกต้องสามารถละเว้นตัวพิมพ์เล็กและตัวพิมพ์ภาษาเฉพาะอื่น ๆ :
Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));
คุณสามารถตั้งค่าความแรงของ collatorดู javadoc
นี่คือตัวอย่างสำหรับสโลวาเกียที่Š
ควรไปหลังจากS
แต่ใน UTF Š
อยู่ที่ไหนสักแห่งหลังจากZ
:
List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");
Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]
Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]
นี่คือสิ่งที่คุณกำลังมองหา
listOfCountryNames.sort(String::compareToIgnoreCase)
โดยใช้Collections.sort()
เราสามารถจัดเรียงรายการ
public class EmployeeList {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> empNames= new ArrayList<String>();
empNames.add("sudheer");
empNames.add("kumar");
empNames.add("surendra");
empNames.add("kb");
if(!empNames.isEmpty()){
for(String emp:empNames){
System.out.println(emp);
}
Collections.sort(empNames);
System.out.println(empNames);
}
}
}
เอาท์พุท:
sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]
ตัวอักษรจากมากไปน้อย:
List<String> list;
...
Collections.sort(list);
Collections.reverse(list);
เหมือนกันใน JAVA 8: -
//Assecnding order
listOfCountryNames.stream().sorted().forEach((x) -> System.out.println(x));
//Decending order
listOfCountryNames.stream().sorted((o1, o2) -> o2.compareTo(o1)).forEach((x) -> System.out.println(x));
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
/**
*
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
});
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/
// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}
}
}
class Employee {
String name;
Employee (String name) {
this.name = name;
}
}
คุณสามารถลองใช้วิธีที่ฉันทำ
String key
- จะเป็นลำดับที่คุณต้องการและในกรณีนี้ตามลำดับตัวอักษร เพียงใส่ "abc ... "
String list[]
- รายการที่คุณต้องการให้เรียงโดยใช้รหัส
int index
- ตั้งค่าเป็น 0 จะตั้งค่าชดเชยสำหรับคีย์
public static String[] order(String key, String list[], int index) {
ArrayList<String> order_List = new ArrayList<String>();
ArrayList<String> temp_Order_List = null;
char[] key_char = key.toCharArray();
for (int offset = 0; offset < key_char.length; offset++) {
if (key_char.length >= offset + index) {
String str = (index > 1 ? list[0].substring(0, index - 1) : "")
+ new String(key_char, offset, 1);
for (int i = 0; i < list.length; i++) {
temp_Order_List = new ArrayList<String>();
for (int k = 0; k < list.length; k++) {
if (!order_List.contains(list[k])
&& !temp_Order_List.contains(list[k])) {
if (list[k].equalsIgnoreCase(str))
order_List.add(list[k]);
else if (list[k].toLowerCase().startsWith(str.toLowerCase())) {
temp_Order_List.add(list[k]);
}
}
}
if (temp_Order_List.size() > 0) {
if (temp_Order_List.size() > 1) {
String[] add = order(key,
temp_Order_List.toArray(new String[temp_Order_List
.size()]), index + 1);
for (String s : add) {
order_List.add(s);
}
} else {
order_List.add(temp_Order_List.get(0));
}
}
}
}
}
return order_List.toArray(new String[order_List.size()]);
}