java - 如何对对象的arraylist进行排序?
Posted
技术标签:
【中文标题】java - 如何对对象的arraylist进行排序?【英文标题】:How to sort an arraylist of objects java? 【发布时间】:2012-04-26 02:16:15 【问题描述】:所以我想要一个 java 中的对象数组列表。
我有object1.number
和object2.number
、object3.number
等...但是这些对象除了number
之外还有其他属性,例如name
、distance
等...
因此,如果它正在对array
中的字符串进行排序,那么将一个字符串放入temporal
并让另一个字符串代替它的位置......但是在araryList
的对象中,怎么能我做吗?
我可以将对象移动到数组的那个位置吗?
谢谢。
【问题讨论】:
你的教授想让你自己实现排序算法吗? @joncarl 说的是一个好点,如果是这样,您需要查看气泡排序(它相当容易实现但不是那么快) 是的,我将实现插入排序算法。 @user1253201:弄清楚您需要对对象做什么,并查看List
和ArrayList
中的方法,看看提供了哪些工具来执行此操作。大多数排序依赖于swap
方法,通常是get
、remove
和add
方法的组合。
【参考方案1】:
实现你自己的比较器:
Arrays.sort(yourArray, new Comparator<YourClass>()
@Override
public int compare(YourClass o1, YourClass o2)
//compare object properties
);
【讨论】:
你的意思是Collections
不是数组,他在这里处理的是ArrayList
?
ArrayList 是一个集合。
Arrays.sort 用于数组,例如Object[]
。如问题中所述,要对 ArrayList 进行排序,您将使用 @Papa_Jay 指出的 Collections.sort
。
但是,这似乎是题外话,因为 OP 显然应该实现排序算法【参考方案2】:
你需要实现可比较的接口
implements Comparable
完成工作的方法是
public int compareTo(Object obj)
请注意,由于可以在 implements 语句中使用通用语法(如下所示),因此 object 经常被完整的类型替换。
一个完整的例子是here in the tutorial docs希望这会有所帮助
一个完整的例子(取自上面的链接如下),我添加了这个以防链接在某个时候失效
import java.util.*;
public class Name implements Comparable<Name>
private final String firstName, lastName;
public Name(String firstName, String lastName)
if (firstName == null || lastName == null)
throw new NullPointerException();
this.firstName = firstName;
this.lastName = lastName;
public String firstName() return firstName;
public String lastName() return lastName;
public boolean equals(Object o)
if (o == null || !(o instanceof Name))
return false;
Name n = (Name) o;
return n.firstName.equals(firstName) && n.lastName.equals(lastName);
public int hashCode()
return 31*firstName.hashCode() + lastName.hashCode();
public String toString()
return firstName + " " + lastName;
public int compareTo(Name n)
int lastCmp = lastName.compareTo(n.lastName);
return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
文章中的客户端代码是:
import java.util.*;
public class NameSort
public static void main(String[] args)
Name nameArray[] =
new Name("John", "Smith"),
new Name("Karl", "Ng"),
new Name("Jeff", "Smith"),
new Name("Tom", "Rich")
;
List<Name> names = Arrays.asList(nameArray);
Collections.sort(names);
System.out.println(names);
【讨论】:
【参考方案3】:您需要为此使用比较器。
【讨论】:
【参考方案4】:根据您的问题,我认为您应该自己实现排序算法。如果是这种情况,您可以操纵 ArrayList 中元素的位置,它的工作方式与常规数组略有不同。看看add(int index, E element)
。 index
参数让您决定在 ArrayList 中的哪个位置添加元素。
【讨论】:
我认为您想将他引导到 set 方法而不是 add 方法。 add 方法,滑动元素而不是替换它们。 @ColinD 不一定。虽然您可以用另一个元素替换一个元素,但您也可以删除一个元素,然后将其放置到新位置,这在某种程度上取决于算法。 除非你盯着一个排序数组并添加新元素,否则使用 add() 会隐藏性能损失,因为它需要移动所有具有更高索引的元素。这同样适用于 remove()。使用 set() 是更新数组中条目的 O(1) 方式,这是您想要的排序方式。【参考方案5】:要像处理传统数组一样操作 ArrayList 的条目,请使用 ArrayList.set(int, E)。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#set%28int,%20E%29
【讨论】:
【参考方案6】:在 Java 8 中使用 Collections.sort()
对 ArrayList 进行排序:
Collections.sort(array, new Comparator<Class>()
@Override
public int compare(Class o1, Class o2)
//compare object properties
);
【讨论】:
以上是关于java - 如何对对象的arraylist进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据GPA对数组列表进行升序排序? arraylist 包含一个对象数组。 (Java)[重复]