Java 排序多个数组
我有3个数组,其中一个是字符串数组,2个是int数组 现在,当我对一个进行排序时,我必须对它们进行排序 例如:Java 排序多个数组,java,arrays,string,sorting,Java,Arrays,String,Sorting,我有3个数组,其中一个是字符串数组,2个是int数组 现在,当我对一个进行排序时,我必须对它们进行排序 例如: String[] stringarr = {"a", "z", "b"}; int[] intarra = {5, 8, 2}; int[] intarrb = {0, 7, 1}; 我想要的是按intarra对它们进行排序 我可以用 Arrays.sort(intarra); 返回 intarra == {2, 5, 8}; 但是我如何对其他数组进行排序,以便 stringar
String[] stringarr = {"a", "z", "b"};
int[] intarra = {5, 8, 2};
int[] intarrb = {0, 7, 1};
我想要的是按intarra对它们进行排序
我可以用
Arrays.sort(intarra);
返回
intarra == {2, 5, 8};
但是我如何对其他数组进行排序,以便
stringarr == {"b", "a", "z"};
intarrb == {1, 0, 7};
或者我应该使用其他东西来存储数据
字符串数组是一个事件标题,而int数组是事件的时间。这很简单-您需要编写一个方法来获取数组(数组列表、数组数组或数组的var arg)并首先对它们进行排序,这将导致其他数组中元素的索引也发生变化。这很简单-您需要编写一个方法来获取数组(数组列表、数组数组数组或数组的var arg)并首先对它们进行排序,这将导致其他数组中元素的索引也发生变化。使用OOP很容易做到这一点。创建包含数据的结构并指定排序方法:
public class MyStructure implements Comparable
{
public String string;
public int int1;
public int int2;
public int compareTo(Object obj)
{
if (obj instanceof MyStructure)
{
return ((MyStructure) obj.int1) - int1;
}
return 0;
}
}
现在创建这些结构的数组并对该数组进行排序。使用OOP很容易做到这一点。创建包含数据的结构并指定排序方法:
public class MyStructure implements Comparable
{
public String string;
public int int1;
public int int2;
public int compareTo(Object obj)
{
if (obj instanceof MyStructure)
{
return ((MyStructure) obj.int1) - int1;
}
return 0;
}
}
现在创建这些结构的数组并对该数组进行排序。Java推荐的方法不是维护3个单独的数组,而是创建一个对象列表,并使用
Collections.sort()
对对象进行排序(不确定您的用例是否可以这样做)。因此,所有属性将始终保持同步。您的对象应该实现Comparable
接口,因此您将被迫重写compareTo()
方法
public class MySortable implements Comparable {
private String strVal;
private int intVala;
private int intValb;
public int compareTo(MySortable other) {
// Use Integer's compareTo method instead of writing your own logic
return Integer.valueof(intVala).compareTo(Integer.valueOf(other.intVala));
}
}
Java推荐的方法不是维护3个单独的数组,而是创建一个对象列表,并使用
Collections.sort()
对对象进行排序(不确定您的用例是否可以这样做)。因此,所有属性将始终保持同步。您的对象应该实现Comparable
接口,因此您将被迫重写compareTo()
方法
public class MySortable implements Comparable {
private String strVal;
private int intVala;
private int intValb;
public int compareTo(MySortable other) {
// Use Integer's compareTo method instead of writing your own logic
return Integer.valueof(intVala).compareTo(Integer.valueOf(other.intVala));
}
}
创建一个类来封装您提到的三个领域
class MyClass{
String input:
int a;
int b;
}
然后,根据您是否希望对字符串或整数进行排序,创建一个适当的比较器,该比较器将对该字段进行比较,并给出排序后的数组
ArrayList<MyClass> a;
Collections.sort(a, new Comparator<MyClass> {
int compareTo(MyClass a, MyClass b){
a.getInt1()-b.getInt2();
}
arraylista;
Collections.sort(一种新的比较器){
int比较(我的a类、b类){
a、 getInt1()-b.getInt2();
}
使用Comparator的好处是,根据您的用例,您可以对stings和Integer进行排序。创建一个类来封装您提到的三个领域
class MyClass{
String input:
int a;
int b;
}
然后,根据您是否希望对字符串或整数进行排序,创建一个适当的比较器,该比较器将对该字段进行比较,并给出排序后的数组
ArrayList<MyClass> a;
Collections.sort(a, new Comparator<MyClass> {
int compareTo(MyClass a, MyClass b){
a.getInt1()-b.getInt2();
}
arraylista;
Collections.sort(一种新的比较器){
int比较(我的a类、b类){
a、 getInt1()-b.getInt2();
}
使用Comparator的好处是,根据您的用例,您可以对Sting和整数进行排序。Jixi问道:“或者我应该使用其他东西来存储数据?”
是的,您应该这样做。我建议您创建一个新类来存储所有三个内容:
public class TimedEvent implements Comparable<TimedEvent> {
String title;
int time1, time2;
public TimedEvent(String name, int t1, int t2) {
title = name;
time1= t1;
time2=t2;
}
public int compareTo(TimedEvent otherEvent) {
return title.compareTo(otherEvent.title);
}
}
请注意,您未初始化的数组中的任何元素都将为null
,这将在您尝试排序时引发异常。因此,请确保数组的长度正是您所需的长度。如果您不知道要预先存储多少个事件,请改用ArrayList:
ArrayList<TimedEvent> eventList = new ArrayList<>(); //java7 syntax. use
// new ArrayList<TimedEvent>(); if using Java 6.
// lots of events get stored.
eventList.add(new TimeEvent("Start", 125,134));
eventList.add(new TimeEvent("FireClose", 128,139));
eventList.add(new TimeEvent("Important Action", 1328,1339));
Collections.sort(eventList);
ArrayList eventList=new ArrayList();//java7语法。使用
//新建ArrayList();如果使用Java 6。
//存储了很多事件。
添加(新的时间事件(“开始”,125134));
添加(新的时间事件(“FireClose”,128139));
添加(新时间事件(“重要行动”,13281339));
Collections.sort(事件列表);
鸡西问:“还是我应该用别的东西来存储数据?”
是的,您应该这样做。我建议您创建一个新类来存储所有三个内容:
public class TimedEvent implements Comparable<TimedEvent> {
String title;
int time1, time2;
public TimedEvent(String name, int t1, int t2) {
title = name;
time1= t1;
time2=t2;
}
public int compareTo(TimedEvent otherEvent) {
return title.compareTo(otherEvent.title);
}
}
请注意,您未初始化的数组中的任何元素都将为null
,这将在您尝试排序时引发异常。因此,请确保数组的长度正是您所需的长度。如果您不知道要预先存储多少个事件,请改用ArrayList:
ArrayList<TimedEvent> eventList = new ArrayList<>(); //java7 syntax. use
// new ArrayList<TimedEvent>(); if using Java 6.
// lots of events get stored.
eventList.add(new TimeEvent("Start", 125,134));
eventList.add(new TimeEvent("FireClose", 128,139));
eventList.add(new TimeEvent("Important Action", 1328,1339));
Collections.sort(eventList);
ArrayList eventList=new ArrayList();//java7语法。使用
//新建ArrayList();如果使用Java 6。
//存储了很多事件。
添加(新的时间事件(“开始”,125134));
添加(新的时间事件(“FireClose”,128139));
添加(新时间事件(“重要行动”,13281339));
Collections.sort(事件列表);
您确实应该更改存储数据的方式。为什么不创建一个具有3个属性的MyEvent类,并将MyEvent对象存储在一个数组中?然后,您可以通过实现一个基本的自定义比较器对该数组进行排序。您确实应该更改存储数据的方式。为什么不创建一个具有3个属性的MyEvent类,并存储数据ur MyEvent对象在单个数组中?然后,您可以通过实现一个基本的自定义比较器对该数组进行排序。如果他想对int字段进行排序,该怎么办?我的意思是说,使用Comparable,他只能对该特定字段进行排序。但在当前的用例中,他可能想对这三个字段中的任何一个进行排序。只需添加进一步的检查,int1LUE是相等的。如果他想在int字段上排序,该怎么办?我的意思是说,使用Comparable,他只能在该特定字段上排序。但在当前的用例中,他可能想在这三个字段中的任何一个字段上排序。只需添加进一步的检查,看看int1值是否相等。我正在尝试使其工作,但如何将我的事件设置为eventarray?我使用了TimedEvet.title=eventtitle等,但我得到的只是空值。请看我的更新答案。您需要在创建对象和设置字段之前创建该对象。因此,请使用我编写的构造函数,或者