在类中循环和排序ojbects

时间:2018-06-04 19:35:24

标签: java android android-studio

这是一个菜鸟问题,抱歉,但我完全糊涂了。

我创建了一个名为CalendarItems的课程。

字段是:

int index
String description
String textdate
int daysaway

构造函数使用前三个字段。目前我已经在课堂上创建了四个对象。

我现在想做两件事:

  1. 循环遍历CalendarItem 对于每个CalendarItem计算daysaway,这是文本日期和今天之间的差异。我已经想出如何计算这个并且可以通过调用我的item1方法,然后调用item2等来手动添加它。
  2. 但我想了解如何通过循环实现这一目标。如果我在javascript中我有一个多维数组并且可以很容易地创建一个循环来循环它,但在可怕的java新世界中我迷失了

    1. CalendarItems字段上对daysaway进行排序 我想这样做,以便我可以按照最快的顺序将它们显示为CardViews。
    2. [充气CardViews已经证明幸福直截了当,我可以(再次,通过手动'循环)为每个CalendarItem充气卡并添加各个字段它。创建类和字段以及添加我的4个示例对象也起作用,所以它没有完全失去周末。]

      我认为我出错的地方在于我从javascript和Excel VBA的经验中继续思考多维数组,不过我读到的关于java中的对象和迭代器接口以及arraylists,我的脑子只是拒绝接受它。

      我有很多关于此问题的Google,但是对于迭代器而言,每一个简单的指南都是如此。让我比起初时更加困惑。

      提前感谢任何有耐心帮助我的人。

3 个答案:

答案 0 :(得分:1)

对于(1),你试过了什么?如果你需要一个多维数组,没有什么能阻止你使用它。考虑一下:

int dim1 = 5;
int dim2 = 10; // whatever you need
CalendarItem[][] items = new CalendarItem[dim1][dim2];

在这种情况下,您将以与JavaScript相同的方式迭代数组。

for (int i = 0; i < dim1; i++) {
     for (int j = 0; j < dim2; j++) {
         // do whatever you need to do
     }
}

如果您实际上不需要数字索引,也可以阅读增强的for循环。

对于(2),请查看javadocs中的Comparator接口以及Collections类中的方法,特别是排序方法。

答案 1 :(得分:1)

For 1) you can either create array in java or you can use ArrayList and store your objects in that arraylist and iterate over arraylist.

ArrayList<CalendarItem> list = new ArrayList();
list.add(obj1); // obj1 is the instance you created for the calendar item.

for(CalendarItem c: list){
// this is loop , do whatever you want here
}

For sorting, Either write a comparator class or implement comparable interface to your CalenderItem and override method compareTo. In this method you can provide comparison logic based on requirede field.

答案 2 :(得分:1)

我发布我的解决方案,正如我已经写过的那样,它应该是一个完整的解决方案:

public class CalendarItem implements Comparable<CalendarItem> {
    private int index;
    private String description;
    private ZonedDateTime textdate;
    private long daysAway = 0;

    public CalendarItem(int index, String description, ZonedDateTime textdate) {
        this.index = index;
        this.description = description;
        this.textdate = textdate;
        this.calculateDaysAway();
    }

    private void calculateDaysAway() {
        this.daysAway = ChronoUnit.DAYS.between(textdate, ZonedDateTime.now(ZoneId.systemDefault()));
    }

    public long getDaysAway() {
        return daysAway;
    }

    @Override
    public int compareTo(CalendarItem o) {
        if (this.daysAway < o.daysAway) {
            return -1;
        } else if (this.daysAway > o.daysAway) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        CalendarItem c1 = 
                new CalendarItem(0, "One", ZonedDateTime.of(2018, 5, 21, 0, 0, 0, 0, ZoneId.systemDefault()));
        CalendarItem c2 = 
                new CalendarItem(0, "Two", ZonedDateTime.of(2018, 5, 4, 0, 0, 0, 0, ZoneId.systemDefault()));
        CalendarItem c3 = 
                new CalendarItem(0, "Three",ZonedDateTime.of(2018, 5, 11, 0, 0, 0, 0, ZoneId.systemDefault()));
        CalendarItem c4 = 
                new CalendarItem(0, "Four", ZonedDateTime.of(2018, 5, 1, 0, 0, 0, 0, ZoneId.systemDefault()));

        List<CalendarItem> calendarItems = new ArrayList<>(Arrays.asList(c1, c2, c3, c4));

        Collections.sort(calendarItems);

        for (CalendarItem item : calendarItems) {
            System.out.println("Item " + item.getDescription() + " is " + item.getDaysAway() + " days away.");
        }
    }
}

注意:我使用java 8中的ZonedDateTime来表示日期。