Сортировка списка объектов по их переменной int

#java #list #sorting #object

#java #Список #сортировка

Вопрос:

У меня есть класс (ClassOne), в котором есть список экземпляров классов (Process), и я пытаюсь выяснить, как сортировать их на основе их приоритета int .

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

любой метод сортировки работает, я хочу отсортировать каждый объект процесса в списке процессов по их приоритету, от наименьшего к наибольшему.

код после попытки первого решения:

 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 amp;amp; 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);
            
        } 
  

Комментарии:

1. Вы пробовали смотреть на метод сортировки списка? docs.oracle.com/javase/8/docs/api/java/util /…

Ответ №1:

Используйте 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));
  

Комментарии:

1. Когда я меняю processList.get(j 1).priority = key; на processList.set(j 1, key); я получаю сообщение об ошибке «Метод set(int, Process) в списке типов <Process> неприменим для аргументов (int, int)»

2. Извините. Это должно было быть processList.get(i) и не key

3. Я также дал каждому процессу имя, чтобы я мог видеть, хорошо ли он отсортирован. Если я добавлю процесс в список с именем = «A»; и другой с именем = «B»; и запустите сортировку вставки, первый ввод переопределит второй ввод. в конечном итоге вверху будет напечатано A, затем B, но внизу оно просто напечатает A дважды.

4. (Я опубликовал свой новый код InsertionSort в нижней части OP)

Ответ №2:

с 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);
}