【问题标题】:Java Multiple Array SortingJava 多数组排序
【发布时间】:2012-04-28 06:36:04
【问题描述】:

嗨,我目前有 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);
        }
     }

【问题讨论】:

标签: java arrays sorting comparator


【解决方案1】:
  1. 您可以创建一个 class Tuple 来保存字段:petownerfriendcat - 每个都有相关的类型。
  2. 让这个类实现Comparable,基本上就是 根据相关领域进行比较。 [或者,或者—— 为此类实现匹配的Comparator]。
  3. 创建一个Tuple[] combinedArray [或List&lt;Tuple&gt;],并用您的数据填充它。
  4. 现在,您可以对 combineArray 进行排序 - 并且您拥有数据 需要。
  5. 剩下要做的就是迭代已排序的数组并传播 数据返回到原始数组/列表。

【讨论】:

    【解决方案2】:

    你可以声明一个对象:

    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;
        ...
    }
    

    【讨论】:

    • 能否请您告诉我如何将数组添加到对象然后将它们取回我不完全理解
    • 我想我是从这个帖子中想到的,稍后会尝试你的建议谢谢dreamincode.net/forums/topic/37594-create-an-object-array
    • 请看我上面的编辑,它目前无法正常工作
    • 是的,这是我最初的想法,我应该提到我尝试过,在评论之前它仍然想添加该方法,不同之处在于 compareTo 没有两个变量,它只有一个查看我对我的问题的编辑,了解日食添加了什么
    • 刚刚开始工作,做了一些阅读,我会将我的帖子更新为我的最终解决方案并检查你的答案,谢谢,看起来很完美很高兴:)
    【解决方案3】:

    您为什么不创建一个包含一个对象的数组,该对象包含字段 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 方法,而不是通过它们的字段来访问它们,并为这些字段取一些体面的名称。

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      要在 java 中执行此操作,您需要编写自己的构造来执行此操作。

      您正在寻找关联数组功能。要获得这种类型的功能,您可以使用 hashmap 或 hashtable。

      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-22
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        相关资源
        最近更新 更多