有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组如何对Java中的数据集进行排序

我这里有一些数据

 VAN,Ford,Transit,7995
 VAN,Ford,Transit,8900
 VAN,Ford,Transit,6200

我已经拆分了数据,但我需要先从最便宜的货车上订购,我不知道从哪里开始。以下是我目前的代码:

import java.io.BufferedReader;
import java.io.FileReader;


public class Vehicle {
    public static void main(String[]args) throws Exception
    {
        FileReader file = new FileReader("C:/Users/Aaron/Documents/java/car_file.txt");
        BufferedReader reader = new BufferedReader(file);
        String text = "";
        String line = reader.readLine();
        while (line!= null)
        {
            text += line+"\r\n";
            line = reader.readLine();
        }

        System.out.println(text);       
    }
}

我猜你是如何分类和排序数据的,但我不知道从哪里开始


共 (3) 个答案

  1. # 1 楼答案

    首先,让我们将文件中的行解析为Car对象,而不是将它们放在一个大字符串中:

    public static void main(String[]args) throws Exception
    {
        FileReader file = new FileReader("C:/Users/Aaron/Documents/java/car_file.txt");
        BufferedReader reader = new BufferedReader(file);
        List<Car> cars = new ArrayList<Car>();
        String line = reader.readLine();
        while (line!= null)
        {
            cars.add(new Car(line));
            line = reader.readLine();
        }
    }
    
    public class Car {
        private String type;
        private String brand;
        private String model;
        private int price;
    
        public Car(String spec) {
            String[] parts = spec.split(",");
            if (parts == null || parts.length != 4) {
                throw new IllegalArgumentException("Bad car specification: " + spec);
            }
            int i = 0;
            type = parts[i++];
            brand = parts[i++];
            model = parts[i++];
            price = Integer.parseInt(parts[i++]);
       }
    
       public int getPrice() {
            return price;
       }
    
       // other getters and setters could go here
    
       public String toString() {
           return String.format("Car type=%s, brand=%s, model=%s, price=%s", type, brand, model, price);
        }
    }
    

    现在我们需要对它们进行分类。一种方法是实现一个Comparator。另一个答案描述了另一种方法,即让Car类实现Comparable。我没有选择这个解决方案的原因是,它只允许对汽车进行一次排序。如果你以后还想按其他东西排序,那么使用Comparable是不可能的。因此,使用单独的比较器更松散地耦合,因此提供了更大的灵活性

    如果你看一下Comparator的比较方法的JavaDoc(参见上面的链接),它会说:

    Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

    因此,如果第一个参数小于第二个参数,我们必须返回一个负整数:

    public class CarPriceComparator implements Comparator<Car> {
        @Override
        public int compare(Car o1, Car o2) {
            return o1.getPrice() - o2.getPrice();
        }
    }
    

    现在,您可以对汽车列表进行排序,例如,通过调用Collections.sort

    Collections.sort(cars, new CarPriceComparator());
    

    并打印结果:

    for(Car car : cars) {
        System.out.println(car);
    }
    

    注意:我在Car中实现了toString,否则上面的代码只会打印cars的对象引用

  2. # 2 楼答案

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.ArrayList;
    import java.util.Collections;
    
    class Vehicle implements Comparable<Vehicle>{
        private final String type;
        private final String manufacturer;
        private final String model;
        private final int number;
    
        public static void main(String[] args) throws Exception {
            FileReader file = new FileReader("C:/Users/Aaron/Documents/java/car_file.txt");
            BufferedReader reader = new BufferedReader(file);
            String line;
            String[] fields;
            ArrayList<Vehicle> vehicleList = new ArrayList<Vehicle>();
            while ((line=reader.readLine()) != null) {
                fields=line.split(",");
                vehicleList.add(new Vehicle(fields[0], fields[1], fields[2], Integer.parseInt(fields[3])));
            }
            Collections.sort(vehicleList);
            for (Vehicle v : vehicleList) {
                System.out.println(v);
            }
        }
    
        public Vehicle(String type, String manufacturer, String model, int number) {
            this.type = type;
            this.manufacturer = manufacturer;
            this.model = model;
            this.number = number;
        }
    
        @Override
        public int compareTo(Vehicle other) {
            int comparison = this.type.compareTo(other.type);
            if (comparison == 0) comparison=this.manufacturer.compareTo(other.manufacturer);
            if (comparison == 0) comparison=this.model.compareTo(other.model);
            if (comparison == 0) comparison=this.number-other.number;
            return comparison;        
        }
    
        @Override
        public String toString() {
            return type+","+manufacturer+","+model+","+number;
        }
    }
    
  3. # 3 楼答案

    下面是一个我使用可比较的

         public class Employee implements Comparable {
    
    int EmpID;
    String Ename;
    double Sal;
    static int i;
    
    public Employee() {
        EmpID = i++;
        Ename = "dont know";
        Sal = 0.0;
    }
    
    public Employee(String ename, double sal) {
        EmpID = i++;
        Ename = ename;
        Sal = sal;
    }
    
    public String toString() {
        return "EmpID " + EmpID + "\n" + "Ename " + Ename + "\n" + "Sal" + Sal;
    }
    
    public int compareTo(Object o1) {
        if (this.Sal == ((Employee) o1).Sal)
            return 0;
        else if ((this.Sal) > ((Employee) o1).Sal)
            return 1;
        else
            return -1;
    }
    

    }

    还有考试班

         import java.util.*;
    

    公共类可比演示{

    public static void main(String[] args) {
    
        List ts1 = new ArrayList();
        ts1.add(new Employee ("Tom",40000.00));
        ts1.add(new Employee ("Harry",20000.00));
        ts1.add(new Employee ("Maggie",50000.00));
        ts1.add(new Employee ("Chris",70000.00));
        Collections.sort(ts1);
        Iterator itr = ts1.iterator();
    
        while(itr.hasNext()){
            Object element = itr.next();
            System.out.println(element + "\n");
    
        }
    
    }
    

    }

    输出

    EmpID 1 艾娜·哈利 Sal20000。0

    EmpID 0 艾娜·汤姆 Sal40000。0

    EmpID 2 艾娜·麦琪 Sal50000。0

    EmpID 3 艾娜·克里斯 Sal70000。0