【问题标题】:Looking for an algorithm for sorting different types of objects寻找一种对不同类型对象进行排序的算法
【发布时间】:2014-08-22 22:24:03
【问题描述】:

我有两种不同类型的对象,它们都有一个整数来保持它们的优先级。在另一个类中,我想按照取决于这些优先级的顺序遍历每个对象,优先级较高的对象排在优先级较低的对象之前。

现在我的问题是对象有两种不同的类型。这让我更难对它们进行排序。

循环的类有两个ArrayLists,一个持有一种类型的对象,另一个持有另一种类型的对象。

这是我目前想到的:

  1. 创建一个布尔值ArrayList 和两个整数ArrayLists。
  2. 循环遍历第一个对象类型的列表,将 True Boolean 添加到 Boolean 列表,将对象列表中的索引添加到 Integer 列表,并将优先级添加到第二个 Integer 列表。
  3. 现在循环遍历第二类对象的列表,将 False 布尔值添加到布尔列表中,将第二个列表中的索引添加到整数列表中,并将优先级添加到另一个整数列表中。
  4. 现在我将检查ArrayList 的优先级并排序,以便更高的数字排在第一位。同时,我也会按照我对优先级列表的排序方式对其他两个列表进行排序。

在每个列表中只有几个对象(例如每个列表中有四个)的情况下,布尔列表和整数列表可能如下所示:

布尔值:真、真、真、真、假、假、假、假

索引整数:0、1、2、3、0、1、2、3

优先整数:5、7、2、3、4、6、8、1

按优先级排序后,如下所示:

布尔值:假、真、假、真、假、真、真、假

索引整数:2、1、1、0、0、3、2、3

优先整数:8、7、6、5、4、3、2、1

现在循环的类知道谁先走以及它是什么类型的对象。

这会起作用,但它很丑陋,必须有一种更快的方法来做到这一点,或者至少是一种更简单的方法。或者也许做我计划但更有效的事情。我愿意接受完全不同的算法或对我描述的算法进行调整的想法。

【问题讨论】:

标签: java algorithm


【解决方案1】:

不要使用两个列表,而是使用一个列表来关联对象中的每个键(优先级)和值(索引)。

public class Set extends Comparable<Set>{
    public Integer key;
    public Integer value;
    public Set(Integer key, Integer value){
        this.key = key;
        this.value = value;
    }

    public int compareTo(Set s){
        return key.compareTo(s.key)
    }
}

由于这些 Set 对象与其他 Set 对象具有可比性,您只需将它们全部添加到单个 ArrayList 中,然后在该列表上调用 collections.sort()。

或者你可以看看优先队列。 http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html 尽管对于您的简单案例来说,这可能是过度思考的事情。

【讨论】:

  • 这确实是所有答案中最好的!来自竞争对手的回复!
【解决方案2】:

如果这两种类型的对象属于具有公共超类的类,则可以将它们存储在该超类的单个 Collection 中,并对该 Collection 进行排序。

如果没有,您仍然可以定义两个类都实现的接口,例如Priorityable(因为两者都有优先级)。然后您可以将它们存储在该接口的 Collection 中,并按优先级对 Collection 进行排序。

如果两种类型的对象都必须保留在单独的列表中,请根据优先级分别对每个列表进行排序。然后定义一个按顺序遍历这些列表的迭代器。它通过将两个索引(每个列表一个)设置为零来初始化。 next() 方法将比较两个列表中下一个对象的优先级,以确定下一个应返回的对象。

【讨论】:

  • 他/她甚至不需要一个共同的超类,他可以有一个他们都实现的接口
  • @AmirAfghani 这就是我在第二段中所说的。
【解决方案3】:

Collections.sort() 将帮助您比较不同类型对象的值,每个集合实现java.util.Comparator 将是一个不错的选择!但是,请确保所有集合(在您的情况下为 ArrayList)都可以使用自定义的compare() 实现来比较它们,正如Elliott Frisch 所暗示的那样!

【讨论】:

    【解决方案4】:

    如果您可以更改拥有集合的两个不同对象的定义,则可以创建一个定义“优先级”整数的接口,并让两个对象都实现该接口。完成此操作后,您可能应该将它们全部放入一个按“优先级”值排序的有序集合中。

    【讨论】:

      【解决方案5】:

      在 Java 中,一切都是Object。所以共同点是Ojbect。另一个共同点是整数优先级,这是需要排序的。因此,即使您的项目是没有 Animal 父类的 Cats 和 Dogs,您也可以简单地根据您是经常添加元素还是经常阅读元素来对它们进行排序:

      • 如果您经常添加元素,则使用数组的优先级队列`{Integer, Object}

      • 如果您经常阅读元素,则只需使用Object[]=new Object[n][2] 的二维数组

      在 {Object, Object} 的优先级队列中,第一个 Object 是 Integer,第二个是 Cat 或 Dog,您按 Integer 排序。

      或者在您的 n×2 数组 myObjects 中,myObjects[x][0] 是整数,您可以使用任何基本算法对对象进行排序,如 http://www.geekviewpoint.com/java/sorting/selectionsort

      那么您只需要偶尔排序一次,您将列表划分为两个排序列表:一个用于 Cats,另一个用于 Dogs。否则,只需保持队列并在需要时步行即可。使用队列的另一种选择是将 BST 作为http://www.geekviewpoint.com/java/bst/add 并在您需要猫或狗时按顺序行走。如果您喜欢这个答案并且需要进一步的帮助,请告诉我。

      【讨论】:

        【解决方案6】:

        假设您的两个班级是Class1 和Class2。您应该让它们实现如下接口:

        public interface Priorizable
        {
           int getPriority();
        }
        

        然后,为该interface 创建一个Comparator:

        public class PriorityComparator implement Comparator<Priorizable>
        {
          public int compare(final Priorizable p1, final Priorizable p2)
          {
              return Integer.compare(p1.getPriority(), p2.getPriority())
          }
        }
        

        将Class1 和Class2 中的所有对象放在一个列表中并排序:

        Collections.sort(listOfPriorizable, new PriorityComparator());
        

        【讨论】:

          猜你喜欢
          • 2016-07-03
          • 2021-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 1970-01-01
          • 2020-05-02
          相关资源
          最近更新 更多