2

嗨,我目前有 4 个数组,它们都保存着不同的数据,我遇到的问题是我想按字母顺序对其中一个数组进行排序,通常我会这样做

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 进行排序,我的输出应该是这样的,其中所有第三个值现在都是第一个,第一个值现在是第三个(这太简化了,我的实际数组包含数千个输入)

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

有没有一种简单的方法可以做到这一点,我可以对一个数组进行排序并让其他数组跟随。感谢您对此问题的任何帮助。

===编辑===

除了我的解决方案略有不同,因为我做了一点阅读检查的答案是完美的,我在 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 Tuplepet、 和- owner,并为每个字段创建相关类型。friendcat
  2. 使这个类实现Comparable,基本上只是根据相关领域进行比较。Comparator[或者,或者 -为此类实现匹配]。
  3. 创建一个Tuple[] combinedArray[或List<Tuple>],并用您的数据填充它。
  4. 现在,您可以对 combineArray 进行排序 - 并且您拥有所需的数据。
  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 的对象,并让比较器按您想要的字段排序。

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 回答