我上课了#34;时间"有一些变量,如:" int年,月,日" 。 现在,我将数据添加到ArrayList,如:
ArrayList<Time> list = new ArrayList<Time>();
list.add(new Time(2014,15,3));
list.add(new Time(2013,1,5));
list.add(new Time(2011,15,3));
list.add(new Time(2014,12,4));
现在按年份和月份过滤数据我创建了一个for循环,如:
for(i = 0; i<=list.size();i++)
{
if(list.get(i).getYear == 2014 && list.get(i).getMonth == 12)
{
templist.add(new Time(list.get(i).getYear(),list.get(i).getMonth(),list.get(i).getDay()));
}
}
然后它被过滤..但我认为这是一个非常糟糕的做法,因为我的Time.class在日期旁边有很多变量,我想把它们全部传递到一起,我知道怎么做使用&#34; Collection.sort&#34;和#34;比较者&#34;但我确定有更好的方法可以做到这一点..比如addAll或者其他什么......你觉得怎么样?
答案 0 :(得分:1)
使用Collections.sort
是最好的方法。
以下是使用自定义Comparator
:
Collections.sort(list, new Comparator<Time>() {
@Override
public int compare(final Time t1, final Time t2) {
if (t1.getYear() != t2.getYear())
return t1.getYear() - t2.getYear();
if (t1.getMonth() != t2.getMonth())
return t1.getMonth() - t2.getMonth();
return t1.getDay() - t2.getDay();
}
});
for (final Time time : list) {
System.out.printf("%s %s %s\n", time.getYear(), time.getDay(), time.getMonth());
}
以下是如何实现Comparable
接口:
首先,你Time
上课:
public class Time implements Comparable<Time> {
int year;
int day;
int month;
//...
@Override
public int compareTo(Time t) {
if (this.getYear() != t.getYear())
return this.getYear() - t.getYear();
if (this.getMonth() != t.getMonth())
return this.getMonth() - t.getMonth();
return this.getDay() - t.getDay();
}
}
然后,您可以使用以下方式对列表进行排序:
Collections.sort(list);
for (final Time time : list) {
System.out.printf("%s %s %s\n", time.getYear(), time.getDay(), time.getMonth());
}
或者,Time
实施Comparable
后,您可以使用TreeSet
代替ArrayList
,以便对Time
进行排序添加到集合中:
TreeSet<Time> set = new TreeSet<Time>();
set.add(new Time(2014, 15, 3));
set.add(new Time(2013, 1, 5));
set.add(new Time(2011, 15, 3));
set.add(new Time(2014, 12, 4));
for (final Time time : set) {
System.out.printf("%s %s %s\n", time.getYear(), time.getDay(), time.getMonth());
}
答案 1 :(得分:0)
您可以使用Collections.sort
。您只需要在Override
班级compareTo
和Time
中implements Comparable
{{1}}函数。这是可比较的doc
答案 2 :(得分:0)
使用lambda(在Java 8上可用的fitur)过滤集合的最佳方法。
List<Time> times = new ArrayList<Time>
List<Time> filteredTimes = times.stream()
.filter(t -> t.getYear() == 2014 && t.getMonth() == 3).collect(Collectors.toList());
详细了解here。
显然OP错误地将过滤器视为排序。这是排序答案的过时答案
不,使用Comparator
并不是一个糟糕的问题,而且它是Java中进行自定义排序的正确方法。你恨它,因为它如此冗长?欢迎来到Java世界。
创建一个新的Comparator
类(您可以在Time
中使用静态定义)并使用Collections.sort(List<T> list, Comparator<? super T> c)
对其进行排序,或者使Time
类实现{{1只使用Comparable
如果您正在查看在插入新项目时始终排序的列表,那么您正在寻找PriorityQueue。但它是一个队列,因此除了头部之外你无法获得随机索引的项目。但是,您仍然需要Comparable / Comparator使队列能够对其进行排序。
对于您的情况,假设您希望按年份排序Collections.sort(List<T> list)
班级,按月份排序,按月份排序,然后按日期排序。您创建一个Comparator对象:
Time
然后使用class TimeSorterByYearMonthDate implements Comparator<Time>{
int compare(Time o1,Time o2) {
if (o1.getYear() != o2.getYear() ) return o1.getYear().compareTo(o2.getYear());
if (o1.getMonth() != o2.getMonth() ) return o1.getMonth().compareTo(o2.getMonth());
return o1.getDate().compareTo(o2.getDate());
}
}
答案 3 :(得分:0)
&#34; 但我确定有更好的方法可以做到这一点.. &#34;
否,您应该使用Comparator
,或让Time
班级实施Comparable
。使用Collections.sort()
是用Java对数据结构进行排序的标准技术。