1

件名開始時間、終了Event時間などの変数がほとんどない独自のクラスがあります。それから私はこれらを持っているクラスを持っています。ただし、初期化すると、コンストラクターで正しいリストを取得し、そのリストをローカルリストに格納してから、他のメソッドで返そうとしますが、同じリストに対して異なるコンテンツが表示されます。DayEventsDayEvent

これが物事を明確にするためのコードです:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

public class Day {

    private String date;
    private ArrayList<Event> events = new ArrayList<Event>();
    private SimpleDateFormat dayDotMonth = new SimpleDateFormat("dd.MM EEEE");

    public Day(int date, ArrayList<Event> newEvents){
        this.events = newEvents;

        System.out.println("FROM Constructor:");
        for (Event event : this.events) {
            System.out.println(event.getSubject()); // CORRECT LIST
        }

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(date*1000L);
        this.date = dayDotMonth.format(cal.getTime());

    }

    public String getDate(){
        return this.date;
    }

    public ArrayList<Event> getEvents(){

        System.out.println("FROM getEvents():");
        for (Event event : this.events) {
            System.out.println(event.getSubject()); // INCORRECT LIST
        }
        return this.events;
    }

    public int getAmountOfEvents(){
        return this.events.size();
    }
}

コンストラクターでリストを出力すると、正しいリストが得られます。しかし、getEvents()メソッドでリストを印刷すると、その中にある場合とない場合があるイベントが1つだけ表示されDayます。

これが私のイベントクラスです:

    public class Event {

        private int start, end;
    private String subject, eventId, description;

    public Event(int start, int end, String subject, String eventId, String description) {
        this.start = start;
        this.end = end;
        this.subject = subject;
        this.description = description;
        this.eventId = eventId;

    }

    public int getStart() {
        return this.start;
    }

    public int getEnd() {
        return this.end;
    }

    public String getSubject() {
        return this.subject;
    }

    public String getEventId() {
        return this.eventId;
    }

    public String getDescription() {
        return this.description;
    }
}

これが私の呼び出しコードです:

 private void getObjects(String url) throws JSONException, Exception {
            JSONObject jsonObject = new JSONObject(new NetTask().execute(url).get());
            JSONArray job1 = jsonObject.getJSONArray("events");
            ArrayList<Event> events = new ArrayList<Event>();
            Calendar calPrev = Calendar.getInstance();
            int prevDate = 0;
            boolean first = true;

            for (int i = 0; i < job1.length(); i++) {
                JSONObject myJsonObject = job1.getJSONObject(i);
                int start = myJsonObject.getInt("start");
                int end = myJsonObject.getInt("end");
                String subject = myJsonObject.getString("subject");
                String eventId = myJsonObject.getString("eventid");
                String description = myJsonObject.getString("description");

                if(first){
                    prevDate = start;
                    calPrev.setTimeInMillis(start*1000L);
                    events.add(new Event(start,end,subject,eventId,description));
                    first = false;
                }else{
                    Calendar calCur = Calendar.getInstance();
                    calCur.setTimeInMillis(start*1000L);

                    if(calPrev.get(Calendar.YEAR) == calCur.get(Calendar.YEAR) && calPrev.get(Calendar.DAY_OF_YEAR) == calCur.get(Calendar.DAY_OF_YEAR)){
                        events.add(new Event(start,end,subject,eventId,description));
                        calPrev.setTimeInMillis(start*1000L);
                    }else{
                        calPrev.setTimeInMillis(start*1000L);
                        this.days.add(new Day(prevDate,events));
                        prevDate = start;
                        events.clear();
                        events.add(new Event(start,end,subject,eventId,description));
                    }
                }
            }
            this.days.add(new Day(prevDate,events));

System.out.println("Last day added to list\nPrinting events from days:");
        for (Day day : this.days){
            ArrayList<Event> events = day.getEvents();
            for(Event event : events){
            System.out.println(event.getSubject());
            }
        }
        }

私が間違っていることは何ですか?

4

2 に答える 2

2

コンストラクターと呼ばれるものは示していませんが、コレクションへの参照をコピーしているだけであるということは、後でコレクションが変更された場合に、それらの変更が表示されることを意味します。例えば:

ArrayList<Event> events = new ArrayList<Event>();
events.add(new Event(0, 1, "id", "subject", "description"));
Day day = new Day(0, events);
events.clear();
System.out.println(day.getEvents().size()); // 0

私の推測では、呼び出し元のコードで同様のことが起こっていると思います。つまり、すべてDayに同じものを入力しArrayList、それを変更します。発信コードを投稿できれば、それを確認できます。

Dayコンストラクター内で防御コピーを取り、これを変更することができます。

this.events = newEvents;

これに:

this.events = new ArrayList<Event>(newEvents);

さらに、ArrayList変数とパラメーターをタイプに変更することをお勧めしList<Event>ます。一般的には、インターフェースにプログラムすることをお勧めします。startまた、イベントで何が何を意味するのかはまったく明確ではなくend、コードは現在システムのデフォルトのタイムゾーンを使用しています-それは意図されていますか?

于 2012-11-27T07:37:54.563 に答える
0

こんにちは、何も問題はありません。文字列arraylistでテストしましたが、正常に動作します。

ただし、配列リストにデータを入力してクラスに渡す方法はわかりません。以下のようになっている場合は、正常に機能するはずです。

public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

        ArrayList<String> arr = new ArrayList<String>();
        arr.add("1");
        arr.add("2");
        arr.add("3");
        arr.add("4");
        arr.add("5");
        arr.add("6");

        Day d = new Day(1, arr);
        d.getStrings();

    }


package com.talha.examples;    
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

public class Day {

    private String date;
    private ArrayList<String> Strings = new ArrayList<String>();
    private SimpleDateFormat dayDotMonth = new SimpleDateFormat("dd.MM EEEE");

    public Day(int date, ArrayList<String> newStrings){
        this.Strings = newStrings;

        System.out.println("FROM Constructor:");
        for (String s : this.Strings) {
            System.out.println(s); // CORRECT LIST
        }

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(date*1000L);
        this.date = dayDotMonth.format(cal.getTime());

    }

    public String getDate(){
        return this.date;
    }

    public ArrayList<String> getStrings(){

        System.out.println("FROM getStrings():");
        for (String s : this.Strings) {
            System.out.println(s); // INCORRECT LIST
        }
        return this.Strings;
    }

    public int getAmountOfStrings(){
        return this.Strings.size();
    }
}
于 2012-11-27T07:37:22.807 に答える