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

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

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

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

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

谢谢。

【问题讨论】:

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

标签: java sorting object arraylist


【解决方案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
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2014-11-09
          • 2011-05-11
          • 2013-01-06
          • 2015-12-27
          • 1970-01-01
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多