Java 按最大数字对ArrayList的列进行排序
我有一个日期/时间列表,CPM编号用逗号分隔。我必须通读文件并将其放入按最大CPM编号排序的数组列表中,只保留包含前5个CPM的行Java 按最大数字对ArrayList的列进行排序,java,arraylist,Java,Arraylist,我有一个日期/时间列表,CPM编号用逗号分隔。我必须通读文件并将其放入按最大CPM编号排序的数组列表中,只保留包含前5个CPM的行 public class Geiger implements Comparable<Geiger> { private String date; private int CPM; public static void main(String[] args) { List<String> dGeiger
public class Geiger implements Comparable<Geiger> {
private String date;
private int CPM;
public static void main(String[] args) {
List<String> dGeigers = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
String nextLine;
while ((nextLine = br.readLine()) != null) {
if (nextLine.contains("Every Minute")) {
String[] values = nextLine.split(",");
Collections.addAll(dGeigers, values[0] + "\t" + values[2] + "\n");
}
}
} catch (IOException e) {
e.printStackTrace();
}
Collections.sort(dGeigers);
System.out.println(dGeigers.toString());
}
public Geiger(String date, String cPM2) {
this.date = date;
this.CPM = Integer.valueOf(cPM2);
}
public String getDate() {
return date;
}
public int getCPM() {
return CPM;
}
public String toString() {
return date + "\t" + CPM;
}
@Override
public int compareTo(Geiger cpmSort) {
if (this.CPM < cpmSort.CPM) {
return -1;
} else if (this.CPM == cpmSort.CPM) {
return 0;
} else {
return 1;
}
}
}
这是我使用的测试文件。您直接在类中编写了compare方法-当您对这些可比数据进行排序时,排序顺序是硬编码的
为了更灵活的排序,将比较结果提取到比较器中,然后使用比较器进行排序。请参见您直接在类中对compare方法进行了编码-对这些可比数据进行排序时,排序顺序是硬编码的 为了更灵活的排序,将比较结果提取到比较器中,然后使用比较器进行排序。请参见排序-一个字段 当您比较两个
int
或Integer
时,您可以使用您的想法:
if (this.cpm < cpmSort.cpm) {
return -1;
} else if (this.cpm == cpmSort.cpm) {
return 0;
} else {
return 1;
}
或者只是删去:
return cpm - cpmSort.cpm;
排序-两个字段
先按cpm
排序,然后按date
排序:
@Override
public int compareTo(Geiger cpmSort) {
int byCpm = Integer.compare(cpm, cpmSort.cpm);
if (byCpm == 0) {
// "cpm" values are equals, so you have to use different field
return date.compareTo(cpmSort.date);
} else {
// "cpm" vales are NOT equal
return byCpm;
}
}
先按日期排序
后按cpm排序
:
@Override
public int compareTo(Geiger cpmSort) {
int byDate = date.compareTo(cpmSort.date);
if (byDate == 0) {
// "date" values are equals, so you have to use different field
return Integer.compare(cpm, cpmSort.cpm);
} else {
// "date" vales are NOT equal
return byDate;
}
}
班级大扫除
请记住将模型类(Geiger
)从“主”(可运行)类中拆分。例如:
Main.java
:
public class Main {
public static void main(String[] args) {
List<Geiger> geigers = readFromFile();
Collections.sort(geigers);
System.out.println(geigers.toString());
}
private static List<Geiger> readFromFile() {
List<Geiger> geigers = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
String nextLine;
while ((nextLine = br.readLine()) != null) {
if (nextLine.contains("Every Minute")) {
String[] values = nextLine.split(", ");
if (values.length == 3) {
String date = values[0];
String cpm = values[2];
Geiger geiger = new Geiger(date, cpm);
geigers.add(geiger)
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return geigers;
}
}
排序-一个字段
当您比较两个int
或Integer
时,您可以使用您的想法:
if (this.cpm < cpmSort.cpm) {
return -1;
} else if (this.cpm == cpmSort.cpm) {
return 0;
} else {
return 1;
}
或者只是删去:
return cpm - cpmSort.cpm;
排序-两个字段
先按cpm
排序,然后按date
排序:
@Override
public int compareTo(Geiger cpmSort) {
int byCpm = Integer.compare(cpm, cpmSort.cpm);
if (byCpm == 0) {
// "cpm" values are equals, so you have to use different field
return date.compareTo(cpmSort.date);
} else {
// "cpm" vales are NOT equal
return byCpm;
}
}
先按日期排序
后按cpm排序
:
@Override
public int compareTo(Geiger cpmSort) {
int byDate = date.compareTo(cpmSort.date);
if (byDate == 0) {
// "date" values are equals, so you have to use different field
return Integer.compare(cpm, cpmSort.cpm);
} else {
// "date" vales are NOT equal
return byDate;
}
}
班级大扫除
请记住将模型类(Geiger
)从“主”(可运行)类中拆分。例如:
Main.java
:
public class Main {
public static void main(String[] args) {
List<Geiger> geigers = readFromFile();
Collections.sort(geigers);
System.out.println(geigers.toString());
}
private static List<Geiger> readFromFile() {
List<Geiger> geigers = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
String nextLine;
while ((nextLine = br.readLine()) != null) {
if (nextLine.contains("Every Minute")) {
String[] values = nextLine.split(", ");
if (values.length == 3) {
String date = values[0];
String cpm = values[2];
Geiger geiger = new Geiger(date, cpm);
geigers.add(geiger)
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return geigers;
}
}
Geiger
类的compareTo
方法,因为没有构造Geiger
类的实例,应该按照如下方式修复:List dgeers=new ArrayList();
// ...
如果(nextLine.contains(“每分钟”)){
字符串[]值=nextLine.split(“,”);
添加(新的盖革(值[0],值[2]);
}
compareTo
应如下所示:@覆盖
公共整数比较(盖革排序){
返回整数.compare(cpmSort.CPM,this.CPM);//将参数顺序更改为降序排序
}
dGeigers
列表中选择前5个元素,有几种方法:- 使用
List::subList
Collections.sort(dGeigers);//将使用Geiger::compareTo进行排序
List top5=dgegers.subList(0,Math.min(5,dgegers.size());
- 使用流API:
List top5=dgegers.stream()
.sorted()//使用更新的'compareTo'方法
.限额(5)
.collect(Collectors.toList());
Geiger
类的compareTo
方法,因为没有构造Geiger
类的实例,应该按照如下方式修复:List dgeers=new ArrayList();
// ...
如果(nextLine.contains(“每分钟”)){
字符串[]值=nextLine.split(“,”);
添加(新的盖革(值[0],值[2]);
}
compareTo
应如下所示:@覆盖
公共整数比较(盖革排序){
返回整数.compare(cpmSort.CPM,this.CPM);//将参数顺序更改为降序排序
}
dGeigers
列表中选择前5个元素,有几种方法:- 使用
List::subList
Collections.sort(dGeigers);//将使用Geiger::compareTo进行排序
List top5=dgegers.subList(0,Math.min(5,dgegers.size());
- 使用流API:
List top5=dgegers.stream()
.sorted()//使用更新的'compareTo'方法
.限额(5)
.collect(Collectors.toList());
看起来您想创建一个盖革列表,并对CPM部分进行排序
以下是我的建议
- 定义一个比较器
- 读台词
- 基于拆分参数创建Geiger的新实例
- 将它们按相反顺序排序并保存前五名
Integer.parseInt()
抱怨。我建议您将您的方法更改为以下方法,以修剪
空白
public Geiger(String date, String cPM2) {
this.date = date;
this.CPM = Integer.valueOf(cPM2.trim());
}
我还建议您使
Geiger
成为自己的类,而不使用静态主入口点。通常,您有一个driver类,它读取数据并使用其他类和机制来操作数据。看起来您想要创建一个盖革列表,并在CPM部分进行排序
以下是我的建议
- 定义一个比较器
- 读台词
- 基于拆分参数创建Geiger的新实例
- 将它们按相反顺序排序并保存前五名
Integer.parseInt()
抱怨。我建议您将您的方法更改为以下方法,以修剪
空白
public Geiger(String date, String cPM2) {
this.date = date;
this.CPM = Integer.valueOf(cPM2.trim());
}
我还建议您使
Geiger
成为自己的类,而不使用静态主入口点。通常,您有一个驱动程序类来读取数据,并使用其他类和机制来操作数据。还添加了部分示例输入文件。通过方法compareTo
的实现,列表按CPM字段排序,而字段date
不参与排序。您应该使用Integer.compare(int,int)在compareTo方法中,而不是手动写出分支。@bliss你能为我详细说明一下吗?使用Integer.compare(int,int)和我使用的有什么区别?@Summawata看一下。它做同样的事情