[英]How to define a Comparator in Java that compares based on two variables
我想創建一個比較器進行操作,使得到達時間較短的進程首先出現在排序中,如果兩個進程具有相同的到達時間,那么具有較低進程ID的進程將首先排序。 我嘗試了以下代碼,但它似乎沒有工作。 有沒有人看到它的缺陷?
public class FCFSComparator implements Comparator<Process>
{
public int compare(Process o1, Process o2)
{
int result = o1.getArrivalTime() - o2.getArrivalTime();
if(result == 0)
{
return (o1.getPid() < o2.getPid()) ? -1 : 1;
}
else
{
return result;
}
// return (result != 0 ? result : o1.getPid() - o2.getPid());
}
}
具體而言,給出如下過程
pid = 0 arrival time = 10
pid = 1 arrival time = 30
pid = 2 arrival time = 15
pid = 3 arrival time = 15
pid = 4 arrival time = 66
我最后得到以下訂購
Pid = 0 arrival time = 10
Pid = 2 arrival time = 15
Pid = 1 arrival time = 30
Pid = 4 arrival time = 66
Pid = 3 arrival time = 15
我發現你的比較器沒有任何問題。 這是我的測試用例:
public class TestComparator {
static class Process {
int pid;
int arrivalTime;
Process(int pid, int arrivalTime) {
this.pid = pid;
this.arrivalTime = arrivalTime;
}
@Override
public String toString() {
return "Process [pid=" + pid + ", arrivalTime=" + arrivalTime + "]";
}
}
static class FCFSComparator implements Comparator<Process> {
public int compare(Process o1, Process o2) {
int result = o1.arrivalTime - o2.arrivalTime;
if (result == 0) {
return (o1.pid < o2.pid) ? -1 : 1;
} else {
return result;
}
}
}
public static void main(String[] args) {
List<Process> processes = Arrays.asList(
new Process(0, 10),
new Process(1, 30),
new Process(2, 15),
new Process(3, 15),
new Process(4, 66));
Collections.sort(processes, new FCFSComparator());
for (Process process : processes) {
System.out.println(process);
}
}
}
輸出:
Process [pid=0, arrivalTime=10]
Process [pid=2, arrivalTime=15]
Process [pid=3, arrivalTime=15]
Process [pid=1, arrivalTime=30]
Process [pid=4, arrivalTime=66]
我假設你比較的東西都是int
。 在兩個變量相等的情況下,您仍然從內部比較返回1。 這樣的事情應該有所幫助:
public class FCFSComparator implements Comparator<Process>
{
public int compare(Process o1, Process o2)
{
int result = o1.getArrivalTime() - o2.getArrivalTime();
if (result == 0)
{
return o1.getPid() - o2.getPid();
}
else
{
return result;
}
}
}
編輯:我檢查了上面的代碼,它確實輸出了正確的順序。 我只能假設你的代碼中的其他地方有一個bug。
Pid = 0 arrival time = 10
Pid = 2 arrival time = 15
Pid = 3 arrival time = 15
Pid = 1 arrival time = 30
Pid = 4 arrival time = 66
完整的測試代碼是:
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class Main
{
public static void main(String[] args)
{
List<Process> processes = new ArrayList<Process>();
processes.add(new Process(10, 0));
processes.add(new Process(30, 1));
processes.add(new Process(15, 2));
processes.add(new Process(15, 3));
processes.add(new Process(66, 4));
Collections.sort(processes, new FCFSComparator());
for (Process process : processes)
System.out.println("Pid = " + process.getPid() + " arrival time = " + process.getArrivalTime());
}
static class FCFSComparator implements Comparator<Process>
{
public int compare(Process o1, Process o2)
{
int result = o1.getArrivalTime() - o2.getArrivalTime();
if (result == 0)
{
return o1.getPid() - o2.getPid();
}
else
{
return result;
}
}
}
static class Process
{
private int arrivalTime;
private int pid;
Process(int arrivalTime, int pid)
{
this.arrivalTime = arrivalTime;
this.pid = pid;
}
public int getArrivalTime()
{
return arrivalTime;
}
public int getPid()
{
return pid;
}
}
}
我相信你想要這個:
public class FCFSComparator implements Comparator<Process> {
public int compare(Process o1, Process o2) {
if (o1.getArrivalTime() == o2.getArrivalTime()) {
return (o1.getPid() < o2.getPid()) ? -1 : 1;
}
return (o1.getArrivalTime() < o2.getArrivalTime()) ? -1 : 1;
}
}
最簡單的是:
public class FCFSComparator implements Comparator<Process>
{
public int compare(Process o1, Process o2)
{
int timeCmp = Integer.valueOf(o1.getArrivalTime()).compareTo(Integer.valueOf(o2.getArrivalTime()));
return (timeCmp != 0 ? timeCmp : Integer.valueOf(o1.getPid()).compareTo(Integer.valueOf(o2.getPid())));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.