用Java排序数组

时间:2011-05-19 17:46:49

标签: java arrays

所以我在java中有一个类,我将变量组合在一起来创建我的对象,如下所示:

public class ExampleClass
{
    private String name;
    private String test;
    private int etc;

    public ExampleClass()
    {
    }

    public String getName()
    {
        return name;
    }

    public void setName(String newName)
    {
        name = newName;
    }

    // ... 
}

然后我创建了一个数组或这些对象的列表,但对于这个问题我们会说一个数组:

int counter = 10;
ExampleClass e[] = new ExampleClass[counter];

for(int i = 0; i < counter; i++)
{
    ExampleClass e2 = ExampleClass();
    e2.setName("a name"); // string grabbed from some other source...
    // ...

    e[i] = e2;
}

然后我用数据填充值,这些数据可以是任何东西。现在我的问题是,如何按照其中一个变量的字母顺序对数组(或列表)进行排序,例如name?我之前使用过Arrays.sort(theArray)这个版本是String[],但我无法理解如何使用自定义类进行此操作。

请注意,这完全适用于Android的java,但平台无关紧要。

5 个答案:

答案 0 :(得分:6)

您可以为ExampleClass创建Comparator并使用SortedSet来保留您的对象。这样,您的对象将始终被排序。例如,

public class EComparator implements Comparator<ExampleClass> {

  public int compare(ExampleClass o1, ExampleClas o2) {
    return o1.getName().compareTo(o2.getName);
  }

}

然后使用TreeSet自动对您的示例进行排序:

SortedSet<ExampleClass> data = new TreeSet<ExampleClass>(new EComparator());
data.add(e1);
data.add(e2);
data.add(e3);
data.add(e4);

答案 1 :(得分:2)

String类实现Comparable接口,这就是为什么可以使用Arrays.sort method对数组中的String对象进行排序的原因。

为您的ExampleClass类实现Comparable接口将重新启用您使用Arrays.sort。下面是一个示例实现,其中比较了任意两个name实例的ExampleClass成员。

package com.example;

import java.util.Arrays;

public class ExampleClass implements Comparable<ExampleClass> {
    private String name;
    private String test;
    private int etc;

    public ExampleClass(String name, String test) {
        this.name = name;
        this.test = test;
    }

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }

    /*
     * This is where the comparison of instances occurs.
     * The name of the argument is compared with the name of the current object.
     * For the moment, the compareTo() method of the String class is used.
     * But one could implement this without delegating to other classes,
     * for other schemes of comparison to return a number.
     */
    @Override
    public int compareTo(ExampleClass o) {
        return this.name.compareTo(o.getName());
    }

    @Override
    public String toString() {
        return "[" + name + "," + test + "]";
    }

    // ...

    public static void main(String[] args) {
        ExampleClass[] array = { new ExampleClass("B", "test1"),
                new ExampleClass("A", "test1"), new ExampleClass("D", "test1"),
                new ExampleClass("C", "test1"), new ExampleClass("E", "test1") };
        Arrays.sort(array);
        for(ExampleClass obj:array)
        {
            System.out.println(obj);
        }
    }
}

答案 2 :(得分:2)

  

如何按照其中一个变量(如名称?)的字母顺序对数组(或列表)进行排序?

您需要您的课程来实现Comparable,或者您需要提供自定义Comparator。

Bean Comparator显示了这两种解决方案,并提供了一般解决方案,因此您不必每次都编写比较器。

答案 3 :(得分:1)

查看Comparator或Interface Comparable。

基本上每个实现Comparable的类都会得到一个compareTo(...) - 方法。

a.compareTo(b)将返回 -1 if a<b 0 if a=b and 1 if a>b 对于无法实现Comparable或不希望有类比较器的情况,可以使用类比较方法。

编辑:对引用进行了摸索,现在它至少是可读的,如果不是很漂亮:(

答案 4 :(得分:0)

这里真的很脏,而且“从头到尾”的方法 -

创建一个Hashmap<String,ExampleClass>,其中String表示您想要排序的字符串。每次执行'setname'时,都会向HashMap添加相应的键值映射。

然后检索这个HashMap的所有键并对它们进行排序(这将是一个简单的字符串排序)。现在您已将键存储在已排序的值中,请根据已排序的键列表重新分配数组“e”。

这应该可以完成工作。 然而,说了这句话,这种做法确实让我感到畏缩:)