java - 如何对对象的arraylist进行排序?

Posted

技术标签:

【中文标题】java - 如何对对象的arraylist进行排序?【英文标题】:How to sort an arraylist of objects java? 【发布时间】:2012-04-26 02:16:15 【问题描述】:

所以我想要一个 java 中的对象数组列表。

我有object1.numberobject2.numberobject3.number等...但是这些对象除了number之外还有其他属性,例如namedistance等...

因此,如果它正在对array 中的字符串进行排序,那么将一个字符串放入temporal 并让另一个字符串代替它的位置......但是在araryList 的对象中,怎么能我做吗?

我可以将对象移动到数组的那个位置吗?

谢谢。

【问题讨论】:

你的教授想让你自己实现排序算法吗? @joncarl 说的是一个好点,如果是这样,您需要查看气泡排序(它相当容易实现但不是那么快) 是的,我将实现插入排序算法。 @user1253201:弄清楚您需要对对象做什么,并查看ListArrayList 中的方法,看看提供了哪些工具来执行此操作。大多数排序依赖于swap 方法,通常是getremoveadd 方法的组合。 【参考方案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)[重复]

在Java中按属性值对对象ArrayList进行排序

Java中的ArrayList怎么进行冒泡排序

java - 如何在java中使用布尔值对ArrayLists进行排序?

java----ArrayList

java arraylist 按照对象的属性排序