2

こんにちは私は現在4つの配列を持っており、すべて異なるデータを保持しています。私が遭遇した問題は、配列の1つをアルファベット順に並べ替えたいということです。

class IgnoreCaseComparator implements Comparator<String> {
   public int compare(String strA, String strB) {
      return strA.compareToIgnoreCase(strB);
   }
}
IgnoreCaseComparator icc = new IgnoreCaseComparator();
java.util.Collections.sort(ARRAY,icc);

ARRAYが配列である場合、アルファベット順に並べ替えますが、配列を一緒に並べ替える必要があります。

たとえば、私の配列が次のようになっているとしましょう

Pet Array: [Dog, Cat, Bird]
Owner Array: [Jim, Kyle, Joe]
Friend Array: [Jake, Jim, John]
Cat Array: [false, true, false]

そして、Pet Arrayに基づいて並べ替えたいのですが、出力は次のようになります。3番目の値がすべて最初になり、最初の値が3番目になります(これは、実際の配列に数千の入力が含まれている単純化されたものです)

Pet Array: [Bird, Cat, Dog]
Owner Array: [Joe, Kyle, Jim]
Friend Array: [John, Jim, Jake]
Cat Array: [false, true, false]

これを行う簡単な方法はありますか?1つの配列を並べ替えて、他の配列をフォローさせることができます。この問題についてご協力いただきありがとうございます。

===編集===

私の解決策がわずかに異なる原因を除いて、チェックされた答えを少し読んだのは完璧です私はcompareToメソッドにわずかに異なるリターンラインしかありません

    class Entity implements Comparable<Entity> {
        String Pet;
        String Owner;
        String Friend;
        int Cat;

        Entity(String Pet, String Owner, String Friend, int Cat) {
          this.Pet = Pet;
          this.Owner = Owner;
          this.Friend = Friend;
          this.Cat = Cat;
        }

        @Override
        public int compareTo(Entity other) {
            return this.Pet.compareToIgnoreCase(other.Pet);
        }
     }
4

4 に答える 4

4
  1. フィールドにclass Tuple保持するを作成できます: pet、、 および-それぞれに関連するタイプを使用します。ownerfriendcat
  2. このクラスにを実装さComparableせます。これは基本的に、関連するフィールドに従って比較するだけです。Comparator[または、代わりに-このクラスのマッチングを実装します]。
  3. Tuple[] combinedArray[または]を作成List<Tuple>し、データを入力します。
  4. これで、combinedArrayを並べ替えることができ、必要に応じてデータを取得できます。
  5. やるべきことはすべて残っています-ソートされた配列を繰り返すことです-そしてデータを元の配列/リストに戻します。
于 2012-04-16T22:19:42.840 に答える
4

オブジェクトを宣言できます。

class Entity implements Comparable<Entity> {
    Pet pet;
    Person owner;
    Friend friend;
    boolean cat;

    Entity(Pet pet, Person owner, Friend friend, boolean cat) {
      this.pet = pet;
      this.owner = owner;
      this.friend = friend;
      this.cat = cat;
    }

    public int compareTo(Entity b) {
      return pet.getName().compareToIgnoreCase(b.pet.getName());
    }
 }

次に、これらのオブジェクトの配列またはリストを作成します。そして、並べ替え。

Entity[] array = new Entity[pets.length];
for (int i = 0; i < pets.length) {
    array[i] = new Entity(pets[i], owners[i], friends[i], cats[i]);
}
Arrays.sort(array);

その後、配列に分割して戻すことができます。

for (int i = 0; i < pets.length) {
    pets[i] = array[i].pet;
    owners[i] = array[i].owner;
    ...
}
于 2012-04-16T22:19:52.973 に答える
0

Pet、Owner、Friend、Catの各フィールドを含むオブジェクトを含む1つの配列を作成し、コンパレータに必要なフィールドで並べ替えてもらいませんか。

class PetContainer { // Find a better name
    public String Pet, Owner, Friend;
    public bool Cat;
}

そしてそれらを配列に入れて

class IgnoreCaseComparator implements Comparator<PetContainer> {
    public int compare(PetContaier PA, PetContainer PB) {
        return PA.Pet.compareToIgnoreCase(PB.Pet);
    }
}

これは単なるラフスケッチです。フィールドからアクセスする代わりにgetメソッドを作成し、フィールドに適切な名前を付けます。

それが役に立てば幸い。

于 2012-04-16T22:23:56.580 に答える
0

これをJavaで行うには、これを行うための独自の構造を作成する必要があります。

連想配列機能を探しています。このタイプの機能を取得するには、ハッシュマップまたはハッシュテーブルを使用できます。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html

public class CustomeDataType 
{
    private String owner;
    private String friend;
    private Boolean isCat;
    // etc
}

Map<String, CustomDataType > petArray = new HashMap<String, CustomeDataType>();
于 2012-04-16T22:29:24.673 に答える