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