Java 按最大数字对ArrayList的列进行排序

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

我有一个日期/时间列表,CPM编号用逗号分隔。我必须通读文件并将其放入按最大CPM编号排序的数组列表中,只保留包含前5个CPM的行

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]);
    }
    
  • 如果需要按CPM字段的相反顺序进行比较(保持最大值),则方法
    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]);
    }
    
  • 如果需要按CPM字段的相反顺序进行比较(保持最大值),则方法
    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看一下。它做同样的事情