Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 寻找排序不同类型对象的算法_Java_Algorithm - Fatal编程技术网

Java 寻找排序不同类型对象的算法

Java 寻找排序不同类型对象的算法,java,algorithm,Java,Algorithm,我有两种不同类型的对象,它们都有一个保持优先级的整数。在另一个类中,我想根据优先级顺序遍历每个对象,优先级较高的对象优先于优先级较低的对象 现在我的问题是对象有两种不同的类型。这使得我很难对它们进行分类 循环的类有两个数组列表,一个保存一种类型的对象,另一个保存另一种类型的对象 以下是我到目前为止的想法: 创建一个布尔值的ArrayList,以及两个整数的ArrayList 循环遍历第一个对象类型的列表,将真布尔值添加到布尔值列表,将对象列表中的索引添加到整数列表,并将优先级添加到第二个整数列表

我有两种不同类型的对象,它们都有一个保持优先级的整数。在另一个类中,我想根据优先级顺序遍历每个对象,优先级较高的对象优先于优先级较低的对象

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

循环的类有两个
数组列表
,一个保存一种类型的对象,另一个保存另一种类型的对象

以下是我到目前为止的想法:

  • 创建一个布尔值的
    ArrayList
    ,以及两个整数的
    ArrayList
  • 循环遍历第一个对象类型的列表,将真布尔值添加到布尔值列表,将对象列表中的索引添加到整数列表,并将优先级添加到第二个整数列表
  • 现在循环第二类对象的列表,将一个假布尔值添加到布尔值列表中,将第二个列表中的索引添加到整数列表中,并将优先级添加到另一个整数列表中
  • 现在我将遍历优先级的
    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

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


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

    集合。sort()
    将帮助您比较不同类型对象的值,每个集合实现
    java.util。Comparator
    将是一个很好的选择!但是,一定要确保所有集合(在您的案例中是ArrayList)都可以使用自定义的
    compare()
    实现对它们进行比较,正如
    Elliott Frisch
    所暗示的那样

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

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

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

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

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


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

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

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


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

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

    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)
        }
    }
    
    公共类集扩展了{
    公开整数密钥;
    公共整数值;
    公共集(整型键、整数值){
    this.key=key;
    这个值=值;
    }
    公共整数比较(集合s){
    返回键。比较(s键)
    }
    }
    
    由于这些集合对象与其他集合对象具有可比性,您只需将它们全部添加到单个ArrayList中,然后调用该列表上的collections.sort()

    或者您可以查看优先级队列。 尽管这可能是对你的简单案例的过度思考。

    而不是hav
    public interface Priorizable
    {
       int getPriority();
    }
    
    public class PriorityComparator implement Comparator<Priorizable>
    {
      public int compare(final Priorizable p1, final Priorizable p2)
      {
          return Integer.compare(p1.getPriority(), p2.getPriority())
      }
    }
    
    Collections.sort(listOfPriorizable, new PriorityComparator());