我有一个对象数组如下。
[obj1 obj2 obj3 ...]
数组中的每个对象都具有属性date(java.util.Date)和name(String)。
obj1.date = new Date(); obj1.name =“A”;
数组中的对象已根据日期排序。多个对象可以具有相同的日期值。
现在,如果对象具有相同的日期,我想基于对象的名称对对象数组进行排序。更清楚的是,如果所有对象的日期不同,则对象的顺序不应有任何变化。如果对象具有相同的日期,则仅根据名称对这些对象进行排序。请注意,当前数组已根据日期排序。
举个例子,我有下面的数组 [OBJ1,OBJ2,OBJ3,OBJ4]
obj1.name =“B”; obj1.date = Tue Jul 01 00:00:00 IST 2014;
obj2.name =“D”; obj2.date = Thu Jul 03 00:00:00 IST 2014;
obj3.name =“A”; obj3.date = Thu Jul 03 00:00:00 IST 2014;
obj4.name =“C”; obj4.date = Sun Jul 06 00:00:00 IST 2014;
排序后的数组应该是[obj1,obj3,obj2,obj4]
答案 0 :(得分:2)
Smutje在Java 5到7中为您提供了如何执行此操作的答案。使用Java8,您可以使用功能接口和lambda表达式。所以你的排序方法会减少到
Arrays.sort(objectArray, Comparator.<YourObject>comparing(YourObject::getDate)
.thenComparing(YourObject::getString));
答案 1 :(得分:1)
写一个Comparator<YourObject>
,首先比较日期,如果日期相同,写一个名称并对数组进行排序
public class YourObject {
private Date date;
private String string;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}
Arrays.sort(new YourObject[]{}, new Comparator<YourObject>() {
@Override
public int compare(YourObject o1, YourObject o2) {
final int dateComparisonResult = o1.getDate().compareTo(o2.getDate());
final int yourObjectComparisonResult;
if (dateComparisonResult == 0) {
yourObjectComparisonResult = o1.getString().compareTo(o2.getString());
} else {
yourObjectComparisonResult = dateComparisonResult;
}
return yourObjectComparisonResult;
}
});
答案 2 :(得分:1)
Object[] obj = {obj1,obj2,obj3};
你的阵列就像这样
您只需将其转换为`java.util.List`,因为它具有有用的API(类和接口),因此您可以轻松访问该API而不是您自己的强硬编码
步骤1:List l = Arrays.asList(obj);
获得List的引用后,您可以使用`Collections.sort(Collection)`
对列表进行排序。步骤2:赞,Collections.sort(l);
如果您想要自己的排序技术,例如按日期或按名称
你只需使用java.util.Comparator
界面
例如,Byname基于这样排序代码片段,
class ByName implements Comparator<String>{
@Override
public int compare(String str1, String str2) {
// TODO Auto-generated method stub
if(str1.length > str2.length)
return 1;
else
return -1;
}
}