【问题标题】:Sorting List of Objects by their int variable按 int 变量对对象列表进行排序
【发布时间】:2021-01-25 01:46:56
【问题描述】:

我有一个类 (ClassOne),它有一个实例类 (Process) 的列表,我试图弄清楚如何根据它们的优先级对它们进行排序。

public class ClassOne
{
    static List<Process> processList = new ArrayList<Process>();

    public static void main(String[] args)
    {
        //hardcoded for example
        processList.add(new Process(3));
        processList.add(new Process(1));
        processList.add(new Process(2));
        
        The processes are current not ordered in the List by priority, so I call insertion sort
    }

    //Im pretty sure this is changing their priority instead of where they are in the List, but i dont know how to change it
    public static void InsertionSort()
    {
        int n = processList.size(); 
        for (int i = 1; i < n; ++i) 
        { 
            int key = processList.get(i).priority; 
            int j = i - 1; 
 
            /* Move elements of processList.get(0..i-1]).priority, that are 
               greater than key, to one position ahead 
               of their current position */
            while (j >= 0 && processList.get(j).priority > key)
            {
                processList.get(j+1).priority = processList.get(j).priority; 
                j = j - 1; 
            } 
            processList.get(j + 1).priority = key; 
        }

}

public class Process
{
    int priority;
    public Process(int tempPriority)
    {
        priority = tempPriority;
    }
}

任何排序方法都可以,我想按优先级从最小到最大对 processList 中的每个 Process 对象进行排序。

尝试第一个解决方案后的代码:

public static void InsertionSort()
    {
         System.out.println(processList.get(0).name);
         System.out.println(processList.get(1).name);
        int n = processList.size(); 
        for (int i = 1; i < n; ++i) 
        { 
            int key = processList.get(i).priority; 
            int j = i - 1; 
            //The method set(int, Process) in the type List<Process> is not applicable for the arguments (int, int)
            /* Move elements of processList.get(0..i-1]).priority, that are 
               greater than key, to one position ahead 
               of their current position */
            while (j >= 0 && processList.get(j).priority > key)
            {
                processList.set(j + 1, processList.get(j));
                j = j - 1; 
            } 
            processList.set(j + 1, processList.get(i));
            System.out.println("Queue Sorted");
            System.out.println(processList.get(0).name);
            System.out.println(processList.get(1).name);
            
        } 

【问题讨论】:

标签: java list sorting


【解决方案1】:

使用 java 8+ 你可以试试下面的代码:

import java.util.*;
import java.util.stream.Collectors;
public static void InsertionSort()
{
    System.out.println(processList.get(0).name);
    System.out.println(processList.get(1).name);
    System.out.println(processList.get(2).name);
    
    processList=processList.stream()
    .sorted((o1,o2)->{return o1.priority-o2.priority;})
    .collect(Collectors.toList());
    
    System.out.println(processList.get(0).name);
    System.out.println(processList.get(1).name);
    System.out.println(processList.get(2).name);
}

【讨论】:

    【解决方案2】:

    使用List#set 在索引处设置元素。

    processList.get(j+1).priority = processList.get(j).priority; 
    

    变成

     processList.set(j+1, processList.get(j));
    

    processList.get(j + 1).priority = key; 
    

    变成

    processList.set(j+1, processList.get(i));
    

    【讨论】:

    • 当我改变 processList.get(j + 1).priority = key;到 processList.set(j+1, key);我收到错误“List 类型中的方法 set(int, Process) 不适用于参数 (int, int)”
    • 对不起。一定是processList.get(i) 而不是key
    • 我也给每个进程起了一个名字,这样我就可以看看它是否排序好。如果我将一个进程添加到名称 =“A”的列表中;另一个名称为“B”;并运行插入排序,第一个输入将覆盖第二个输入。它最终会打印 A,然后在顶部打印 B,但在底部它只会打印 A 两次。
    • (我在 OP 底部发布了我的新 InsertionSort 代码)
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2022-01-14
    • 2022-11-17
    相关资源
    最近更新 更多