如何获取新的ArrayList数据?

时间:2014-09-03 08:28:47

标签: java arraylist

我上课了#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或者其他什么......你觉得怎么样?

4 个答案:

答案 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班级compareToTimeimplements 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对数据结构进行排序的标准技术。