2016-04-06 10 views
3

私は2つの配列を持ち、1つは都市の距離を格納し、もう1つは対応する母集団を格納します。都市の距離が昇順であれば、すべてがうまくいきます。 しかし、誰かが距離をランダムに入力したとしましょう。どのようにして都市の配列を並べ替えることができますか、それぞれの都市の人口がそれぞれの都市人口の指標と同じインデックスにあることを確認することができます。例えばJavaでの並列配列の並べ替え

:市1は、人口333

  • 市3は人口33333
  • 市5は、人口33

  • int[] city = {1, 3, 5}; 
    int[] pop = {333, 33333, 33}; 
    

    を持っていた

    • すべてがあるため正常に動作します都市配列は既にソートされています。

      しかし、ときに私の入力:

      int[] city = {3, 1, 5}; 
          int[] pop = {3333, 333, 33}; 
      

      大きな問題!

      配列の都市を並べ替え、その配列のすべての要素がそれぞれの都市と同じインデックスにあることを確認します。

    +7

    関連情報であるため、両方の情報をCityオブジェクトに保存することをお勧めします。 – marcellorvalle

    +5

    最近私は並列配列が目立っていくつかの質問を見ました。これは1960年代のことです。誰がこれを教えていますか?どうして?どのようにしてこれをやめ、OOの原則を1日目から教えるようにするのですか? –

    答えて

    1

    「安い」の方法は両方とも、他の配列

    のインデックスを表すnに0が含まれます3番目の配列を持っている。しかし、彼らはクラスにグループ分けした場合あなたが持っている問題は消えてしまうだろう情報は論理的に関連しているように見える。 そして、あなたはComparableを実装します:https://stackoverflow.com/a/18896422

    8

    これを行うには良い方法は、市内のクラスを持っている:

    class City{ 
        private int id; 
        private long population; 
    
        //... getters, setters, etc 
    } 
    

    都市コンパレータクラス:

    class CityPopulationComparator implements Comparator<City> { 
        @Override 
        public int compare(City c1, City c2) { 
         return Long.compare(c1.getPopulation(), c2.getPopulation()); 
        } 
    } 
    

    と都市の配列リスト:

    ArrayList<City> cities; 
    

    最後に次のように並べ替えます。

    Collections.sort(cities, new CityPopulationComparator()); 
    

    しかしあなたは都市や人口この方法を持っている必要がある場合は、ソート方法を自分(例えば、バブルソート)を書くことができますし、二つの都市を交換するたびに、また、対応するpupulationsを入れ替えます。

    +1

    'City'クラスは、代わりに' Comparable 'を実装することもできます。このようにして 'Collections.sort'を' cities'のコレクションだけで呼び出すことができます。 –

    +0

    また、ソートやコレクションを扱う際には、オブジェクトはequals()メソッドとhashCode()メソッドをオーバーライドする必要があります。これにより、各オブジェクトは本当にユニークなものになります。 –

    +0

    @ Mr.Polywhirlはい。シティの「自然な」注文ではないと私は思っていたので、私は「コンパレーター」の方法を選びました。 –

    2

    あなたの街のIDが一意である場合:

    int[] city = {3, 1, 5}; 
        int[] pop = {3333, 333, 33}; 
        Map<Integer, Integer> arr = new HashMap<Integer, Integer>(city.length); 
        for (int i = 0; i < city.length; i++) { 
         arr.put(city[i], pop[i]); 
        } 
        Arrays.sort(city); 
        for (int i = 0; i < city.length; i++) { 
         pop[i] = arr.get(city[i]); 
        } 
    
    3

    正解がthisです。しかし、あなたは完全に怒っハックをしたい場合は、あなたがこれを行うことができます:

    public final class ParallelIntArrays extends AbstractList<int[]> { 
    
        private final int[] array1; 
        private final int[] array2; 
    
        public ParallelIntArrays(int[] array1, int[] array2) { 
         if (array1.length != array2.length) 
          throw new IllegalArgumentException(); 
         this.array1 = array1; 
         this.array2 = array2; 
        } 
    
        @Override 
        public int[] get(int i) { 
         return new int[] { array1[i], array2[i] }; 
        } 
    
        @Override 
        public int size() { 
         return array1.length; 
        } 
    
        @Override 
        public int[] set(int i, int[] a) { 
         if (a.length != 2) 
          throw new IllegalArgumentException(); 
         int[] b = get(i); 
         array1[i] = a[0]; 
         array2[i] = a[1]; 
         return b; 
        } 
    } 
    

    次に、あなたが行うことができます:上に書いたように、ParallelIntArraysListとして正しく機能していないこと

    int[] city = {5, 1, 2, 4, 3 }; 
    int[] pop = {100, 30, 4000, 400, 5000}; 
    new ParallelIntArrays(city, pop).sort(Comparator.comparingInt(arr -> arr[0])); 
    System.out.println(Arrays.toString(city)); 
    System.out.println(Arrays.toString(pop)); 
    

    注意を。例えば、list.contains(list.get(0))falseとなります。代わりにList<IntBuffer>またはList<List<Integer>>に変更した場合は修正されます。