在Java中对数组排序
因此,我有一个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
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
?好的,我将发布示例代码。试试看;不能保证它可以编译,但它会让您了解如何实现一个可比较的接口。