我有一个类似下面的arraylist:
ArrayList<PhoneNumber> arrayListToSort
PhoneNumber具有以下属性
private String number;
private String numberType;
数字类型类似于 MOBILE,HOME,OFFICE
我想按每个arrayListToSort
排序numberType
。
我可以用简单的alphebetical命令做到这一点。
但我的问题是如何按顺序对列表进行排序。
答案 0 :(得分:1)
嘿,您可以尝试 PhonNumberType with enum 检查以下代码
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
enum PhonNumberType {
MOBILE, HOME, OFFICE
}
class PhoneNumber implements Comparable<PhoneNumber> {
private String number;
private PhonNumberType phonNumberType;
@Override
public int compareTo(PhoneNumber o) {
return this.phonNumberType.compareTo(o.phonNumberType);
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public PhonNumberType getNumberType() {
return phonNumberType;
}
public void setNumberType(PhonNumberType phonNumberType) {
this.phonNumberType = phonNumberType;
}
@Override
public String toString() {
return "PhoneNumber [number=" + number + ", phonNumberType=" + phonNumberType + "]";
}
}
public class T {
public static void main(String[] args) {
List<PhoneNumber> test = new ArrayList<PhoneNumber>();
PhoneNumber pn = new PhoneNumber();
pn.setNumber("1");
pn.setNumberType(PhonNumberType.HOME);
test.add(pn);
pn = new PhoneNumber();
pn.setNumber("2");
pn.setNumberType(PhonNumberType.MOBILE);
test.add(pn);
pn = new PhoneNumber();
pn.setNumber("3");
pn.setNumberType(PhonNumberType.OFFICE);
test.add(pn);
Collections.sort(test);
System.out.println(test);
}
}
输出为:[PhoneNumber [number = 2,phonNumberType = MOBILE], PhoneNumber [number = 1,phonNumberType = HOME],PhoneNumber [number = 3, phonNumberType = OFFICE]]
答案 1 :(得分:0)
您的排名不是自然顺序。
要获得目标结果,您必须定义自己的比较器。
顺便说一下,正如@Alexis C.所说,使用Enum作为numberType
答案 2 :(得分:0)
使用枚举:
public enum NumberType {
MOBILE,HOME,OFFICE;
}
如果您的PhoneNumber具有可比性:
@Override
public int compareTo(PhoneNumber o) {
return numberType.compareTo(o.numberType);
}
它将遵循枚举中描述的顺序:
MOBILE,HOME,OFFICE
答案 3 :(得分:0)
有两种方法可以做到这一点。
Comparator
在此方法中,您使用自定义ArrayList
对Comparator
进行排序。
这是Comparator
代码。请注意它首先尝试对numberType
进行排序,然后number
:
public class PhoneNumberComparator implements Comparator<PhoneNumber> {
@Override
public int compareTo (PhoneNumber lhs, PhoneNumber rhs) {
int result = lhs.numberType.compareTo(rhs.numberType);
if (result == 0) {
result = lhs.number.compareTo(rhs.number);
}
return result;
}
}
然后你可以打电话:
Comparator c = new PhoneNumberComparator();
arrayListToSort.sort (c)
现在,它本身不会完全起作用,因为numberType
的排序只是字符串顺序。强制排序的最方便方法是将numberType
设为enumeration。这是代码:
public enum NumberType { MOBILE, HOME, OFFICE }
然后必须定义PhoneNumber
,以便numberType
为NumberType
:
public class PhoneNumber {
public String number ;
public NumberType numberType;
// .......
}
(顺便说一下,我鼓励您将number
和numberType
变为private
变量,并根据JavaBeans standard添加getter方法。)
PhoneNumber
实施Comparable
如果您打算经常这样做,那么您应该Comparator
实现PhoneNumber
界面,而不是编写Comparable
:
public class PhoneNumber implements Comparable <PhoneNumber> {
public String number ;
public NumberType numberType;
// .......
@Override
public int compareTo (PhoneNumber rhs) {
int result = this.numberType.compareTo(rhs.numberType);
if (result == 0) {
result = this.number.compareTo(rhs.number);
}
return result;
}
}
然后你可以打电话:
arrayList.sort()
如第一种方法所述,您仍需要NumberType
enum
compareTo()
。上述NumberType
实施依赖于Comparable
enum
;所有Comparable
个实例都会自动Comparator
。
请注意compareTo()
和Comparator
实施之间的相似点和不同点。对Comparable
和query ("webView")
can be found here进行了很好的讨论。
答案 4 :(得分:0)
如果您使用NumberType
enum
而非String
,则其compareTo()
方法将根据声明枚举实例的顺序返回结果,不是按字母顺序排列:
public enum NumberType {
MOBILE, HOME, OFFICE;
}
MOBILE
现在小于HOME
且HOME
小于OFFICE
。现在,您可以使用自定义比较器对集合进行排序:
list.sort(comparing(PhoneNumber::getNumberType).thenComparing(PhoneNumber::getNumber));
答案 5 :(得分:0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void arrayListToSort(ArrayList<PhoneNumber> arrayListToSort) {
Map<String, Integer> phoneTypeToOrder = new HashMap<>();
phoneTypeToOrder.put("MOBILE", 0);
phoneTypeToOrder.put("HOME", 1);
phoneTypeToOrder.put("OFFICE", 2);
Collections.sort(arrayListToSort, new Comparator<PhoneNumber>() {
@Override
public int compare(PhoneNumber o1, PhoneNumber o2) {
if (o1 == null || o1.numberType == null) {
return -1;
}
if (o2 == null || o2.numberType == null) {
return 1;
}
Integer o1Order = phoneTypeToOrder.get(o1.numberType);
Integer o2Order = phoneTypeToOrder.get(o2.numberType);
return o1Order.compareTo(o2Order);
}
});
}
}
class PhoneNumber {
String number;
String numberType;
}
答案 6 :(得分:0)
我建议使用自定义&#34;排序方法&#34;叫做比较器。在此比较器中,您可以定义一个&#34;值&#34;对于每个将在运行时计算的记录。此值的计算完全取决于您。例如,您可以定义&#34; foo&#34; == 1,&#34; bar&#34; == 2和&#34;约翰&#34; == 654.然后Java的排序方法会询问每条记录的值&#34;值&#34;并相应地排序(我认为使用Quicksort算法,但我不确定这一点。)
这是一个很好的小教程,可以帮助您了解本主题并演示如何正确实现Comparator和Comparable-Interfaces: http://www.tutorialspoint.com/java/java_using_comparator.htm
这个更深入一点:http://www.journaldev.com/780/java-comparable-and-comparator-example-to-sort-objects
此外:如前所述,请为您的数字类型使用枚举。并不是因为它比较容易(imho),而是因为它比点击字符串更快比更快。
答案 7 :(得分:0)
您可以使用TreeSet集合来对条目进行排序。
TreeSet<PhoneNumber> sortedList = new TreeSet<>((PhoneNumber p1, PhoneNumber p2) -> p1.compareTo(p2));
由于您必须为条目定义订单,因此您的PhoneNumber类必须实现Comparable接口,您需要覆盖compareTo()方法以表示您将在numberType上进行比较
public int compareTo(Object o) {
PhoneNumber p = (PhoneNumber) o;
return numberType.equals(o.getNumberType())?0:numberType.equals("MOBILE")?-1:1;
}
但是,如果您希望将来添加更多数字类型,最好使用enum