寻找一种用于排序不同类型对象的算法

时间:2014-08-21 18:45:14

标签: java algorithm

我有两种不同类型的对象,它们都有一个保持优先级的整数。在另一个类中,我希望按照依赖于这些优先级的顺序遍历每个对象,具有较高优先级的对象先于优先级较低的对象。

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

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

这是我到目前为止所想到的:

  1. 创建ArrayList布尔值和两个ArrayLists整数。
  2. 遍历第一个对象类型的列表,将布尔列表中的True布尔值和对象列表中的索引添加到整数列表,并将优先级添加到第二个整数列表。
  3. 现在循环遍历第二类对象的列表,将布尔列表中的False布尔值和第二个列表中的索引添加到整数列表,并将优先级添加到另一个整数列表。
  4. 现在我将通过ArrayList优先顺序排序,以便排在第一位。与此同时,我也会按照我对优先级列表进行排序的方式对其他两个列表进行排序。
  5. 在每个列表中的对象很少的场景中,每个列表中有四个,这就是布尔列表和整数列表的样子:

      布尔人:真,真,真,真,假,假,假,假

         

    索引整数: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

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

    这样可行,但它很丑陋,必须有更快的方法来做到这一点,或者至少是一种更简单的方法。或者也许做我正在计划但更有效率的事情。我对完全不同的算法或对我所描述的算法的调整持开放态度。

6 个答案:

答案 0 :(得分:3)

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

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 虽然这可能是为你的简单案例而思考的事情。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您可以更改您拥有的两个不同对象的定义,则可以创建一个定义&#34; priority&#34;整数并且两个对象都实现了该接口。一旦你完成了这个,你应该把它们全部放入一个有序的集合中,该集合由&#34; priority&#34;值。

答案 4 :(得分:1)

在Java中,一切都是Object。所以共性是Ojbect。另一个共性是整数优先级,这是需要排序的。因此,即使您的物品是没有动物父类的猫和狗,您也可以对它们进行排序,只是要求您经常添加元素或经常阅读元素:

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

  • 如果您经常阅读元素,那么只需使用Object[]=new Object[n][2]

  • 的2D数组

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

或者在您的n-by-2数组myObjectsmyObjects[x][0]为整数,您可以使用任何基本算法将对象排序为http://www.geekviewpoint.com/java/sorting/selectionsort

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

答案 5 :(得分:0)

假设您的两个班级是Class1Class2。您应该让它们实现如下界面:

public interface Priorizable
{
   int getPriority();
}

然后,为Comparator创建interface

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

Class1Class2中的所有对象放在一个列表中并进行排序:

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