0

私は3つのクラスとメインクラスを持っています。クラスは、都市、ツアー、人口です。人口にはX個のツアーの配列リストがあり、ツアーにはX個の都市の配列リストがあります。都市がXとYの座標にすぎない場合。新しいツアーを作成すると、その中の都市はランダム化され、次にツアーを人口配列リストに追加します。これは正常に機能し、出力はランダム化されます。ただし、配列リストを再度出力すると、ランダム化されなくなり、すべてのツアーが同じになります。これは、いくつかのコードを表示することで説明しやすくなると思います。

Population.java

public class Population {

private ArrayList<Tour> toursList;

public Population(int size, ArrayList<City> loadedCities)
{
    toursList = new ArrayList<Tour>();
    
    // Fill the population with the number of tours
    for (int i = 0; i < size; i++) {
        Tour newTour = new Tour(loadedCities);
        newTour.setId(i);
        toursList.add(newTour);
    }
    
}

public void output() 
{
    for (Tour tour : toursList)
        System.out.println(tour.toString());
}
}

Tour.java

public class Tour {

private ArrayList<City> tour;
private int id = 0;

public Tour(ArrayList<City> cities)
{
    Collections.shuffle(cities);
    tour = cities;
}

public void setId(int i)
{
    this.id = i;
    System.out.println("Constructor: "+toString());
}

public int getId()
{
    return id;
}

public String toString()
{
    String str = "Tour: "+id+" - ";
    for (City city : tour) {
         str += city.toString()+" | ";
    }
    return str;
}
}

City.java

public class City {

private int code;
private Double y;
private Double x;

public City(int code, Double y, Double x)
{
    this.code = code;
    this.y = y;
    this.x = x;
}

public int getCode() 
{
    return code;
}

public Double getX() 
{
    return x;
}

public Double getY()
{
    return y;
}

public String toString()
{
    return "Code: "+this.code+" - X: "+this.x+" Y: "+this.y;
}
}

そして、メインクラスは、citys arraylistをロードした後、次の呼び出しを行います。

Population population = new Population(10, cities);
population.output();

いくつかのprintlnのコンソール出力は次のとおりです(削除されたバージョン)。

Constructor: Tour: 0 - Code: 2 - X: 42373.8889 Y: 11108.6111
Constructor: Tour: 1 - Code: 28 - X: 43026.1111 Y: 11973.0556
Tour: 0 - Code: 8 - X: 42983.3333 Y: 11416.6667
Tour: 1 - Code: 8 - X: 42983.3333 Y: 11416.6667 

ツアーがすべて同じ順序になっていることがわかります。

4

2 に答える 2

2

ArrayList<City> citiesすべてのツアーで同じものを使用します。

Tourコンストラクターは次のようになります。

tour = new ArrayList<City>(cities);
Collections.shuffle(tour);
于 2012-10-23T17:47:15.473 に答える
0

Javaは可変コレクションを使用します。同じコレクションをすべてのツアーに渡すため、何度もシャッフルされますが、最終的には、すべてのツアーが同じ、多くのシャッフルされたコレクションを参照します。

これから学ぶべき2つのこと:

  1. 渡されたコレクションを変更する場合は、最初にコピーを作成します(例new ArrayList(collectionToCopy)) 。
  2. 自分が所有するコレクションを他の人に渡す場合は、まずその人がコレクションを変更できないことを確認してください(例Collections.unmodifiableList(myCollection)

Javaのキャリアの中で、この罠に何度も足を踏み入れることになります。そうしないと、他の誰かがあなたに代わってやってくれます。

于 2012-10-23T17:55:52.887 に答える