在Java中对数组排序

在Java中对数组排序,java,arrays,Java,Arrays,因此,我有一个java类,我将变量分组在一起创建对象,如下所示: public class ExampleClass { private String name; private String test; private int etc; public ExampleClass() { } public String getName() { return name; } public void

因此,我有一个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;
}
int计数器=10;
ExampleClasse[]=新ExampleClass[计数器];
对于(int i=0;i
然后我用数据填充这些值,这些数据可以是任何东西。现在我的问题是,如何按一个变量的字母顺序对数组(或列表)排序,例如
name
?我以前使用过
array.sort(theArray)
作为
String[]
的字符串,但我不太清楚如何使用自定义类来实现这一点

需要注意的是,这些都是针对Android的java语言,但平台应该无关紧要。

您可以为ExampleClass创建一个示例,并使用它保存对象。这样,您的对象将始终被排序。比如说,

public class EComparator implements Comparator<ExampleClass> {

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

}
公共类ecocomparator实现Comparator{
公共整数比较(示例类别o1,示例类别o2){
返回o1.getName().compareTo(o2.getName);
}
}
然后使用自动排序示例:

SortedSet<ExampleClass> data = new TreeSet<ExampleClass>(new EComparator());
data.add(e1);
data.add(e2);
data.add(e3);
data.add(e4);
SortedSet data=new TreeSet(new ecocomparator());
数据。添加(e1);
添加数据(e2);
添加数据(e3);
添加数据(e4);

看看Comparator或Comparable接口

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

a、 compareTo(b)将返回

-1如果ab
对于无法实现Comparable或不想实现Comparable的情况,可以为sort方法提供一个类比较器


编辑:在引号方面做了些手脚,现在它至少是可读的,如果不美观的话:(

String类实现了接口,这就是为什么可以使用

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

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);
        }
    }
}
package.com.example;
导入java.util.array;
公共类ExampleClass实现了可比较的{
私有字符串名称;
私有字符串测试;
私人int等;
公共示例类(字符串名称、字符串测试){
this.name=名称;
这个。测试=测试;
}
公共字符串getName(){
返回名称;
}
public void setName(字符串newName){
name=newName;
}
/*
*这是进行实例比较的地方。
*参数的名称将与当前对象的名称进行比较。
*目前,使用String类的compareTo()方法。
*但是一个人可以实现这一点,而无需授权给其他类,
*对于其他比较方案,返回一个数字。
*/
@凌驾
公共整数比较(例如o类){
返回此.name.compareTo(o.getName());
}
@凌驾
公共字符串toString(){
返回“[”+名称+”,“+测试+”];
}
// ...
公共静态void main(字符串[]args){
ExampleClass[]数组={newexampleClass(“B”,“test1”),
新的ExampleClass(“A”、“test1”)、新的ExampleClass(“D”、“test1”),
新的ExampleClass(“C”,“test1”),新的ExampleClass(“E”,“test1”)};
数组。排序(数组);
例如(例如类对象:数组)
{
系统输出打印项次(obj);
}
}
}
如何按其中一个变量(如名称)的字母顺序对数组(或列表)进行排序

您需要类来实现Comparable,或者需要提供自定义比较器


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

这里有一种非常肮脏的“从头开始”的方法--

创建一个
Hashmap
,其中String表示要根据其进行排序的字符串。每次执行“setname”操作时,都会向Hashmap添加相应的键值映射

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

这应该可以完成工作。
然而,说到这里,这种方法确实让我有些畏缩:)

您可以将其转换为数组或遍历数组。
SortedSet
只保证它将按照您指定的顺序遍历其元素。因此,将其转换为数组或获取迭代器将保证顺序。如果你使用
newarraylist(mySet)
,它也会工作。尽管如此,但我觉得使用
Comparable
接口更面向对象。不确定它是否更面向对象。我看到的唯一区别是,通过创建几个comparator类,您可以定义更多的排序顺序,而Comparable只能定义一个顺序。谢谢,这个方法是我在这里得到的第一个伟大答案。我确实喜欢维尼特的答案,但我无法让这种想法发挥作用+这看起来很有用。我还没有尝试过,因为我得到了一个不同的答案,但谢谢你让我知道。这是我认为最简单的答案,但我无法让它工作。您可以这样做:
公共类ExampleClass实现了Comparator
?好的,我将发布示例代码。试试看;不能保证它可以编译,但它会让您了解如何实现一个可比较的接口。