所以我在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,但平台无关紧要。
答案 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”。
这应该可以完成工作。 然而,说了这句话,这种做法确实让我感到畏缩:)