【问题标题】:How to sort data sets Java如何对数据集进行排序 Java
【发布时间】:2014-06-01 18:32:43
【问题描述】:

我这里有一些数据

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

我猜你是在制作课程并对数据进行排序,但我不知道从哪里开始。

【问题讨论】:

  • 首先为您的数据创建一个类,其中包含您拥有的值的字段 (VAN,For,Transit,7995)。然后将它们放在一个集合中。创建一个比较器,它将对价格字段进行排序并将其与 sort() 方法一起使用。
  • @PeterLiljenberg 你为什么不发布一个答案呢? :)
  • @Joffrey - 我可以,但提问者要求提供一般方向:)
  • @PeterLiljenberg 我的意思不是“发布一个完整的答案来实现你在这里所说的内容”,我的意思是你应该发表你的评论作为答案。
  • @PeterLiljenberg 如果您的答案比其他人更好,但由于无法被接受而不可见,这对未来的读者很重要;)这可能是他们不鼓励在帮助中心的 cmets 中回答的原因。跨度>

标签: java arrays class sorting


【解决方案1】:

我建议为包含合适成员的车辆创建一个类,在您的情况下,三个类型为String,一个类型为int,即Price。然后将为从文本文件中读取的每一行生成一个新实例,填充成员。新实例应放入容器中。您还必须实现一个可以决定实例顺序的比较器 - 在您的情况下,它将检查两个实例的 Price 并可能返回差异。

【讨论】:

    【解决方案2】:

    这是我发现的一个使用可比较的示例

         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.*;
    

    公共类 ComparableDemo{

    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

    【讨论】:

      【解决方案3】:

      首先,让我们将文件中的行解析为 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 耦合更松散,因此提供了更大的灵活性。

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

      比较它的两个参数的顺序。返回负整数、零或正数 整数作为第一个参数小于、等于或大于第二个参数。

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

      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,否则上面的代码只会打印汽车的对象引用。

      【讨论】:

        【解决方案4】:

        试试这个:

        经过测试和执行。为了实现这一点,如果您敏锐地观察,line.split(",")[3]; 将发挥关键作用。

        import java.io.*;
        import java.util.*;
        
        public class ArrageItInOrder{
        
            public static void main(String[] args) throws Exception {
                System.out.println(System.getProperty("user.dir"));
                String filePath="C:/Users/Aaron/Documents/java/car_file.txt";
                BufferedReader reader = new BufferedReader(new FileReader(filePath));
                Map<String, String> map=new TreeMap<String, String>();
                String line="";
                while((line=reader.readLine())!=null){
                    map.put(getField(line),line);
                }
                reader.close();
                FileWriter writer = new FileWriter(filePath);
                for(String val : map.values()){
                    writer.write(val);  
                    writer.write('\n');
                }
                writer.close();
            }
        
            private static String getField(String line) {
                return line.split(",")[3];//extract value you want to sort on
            }
        }
        

        【讨论】:

          【解决方案5】:
          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;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-07-17
            • 2011-10-20
            • 1970-01-01
            • 1970-01-01
            • 2013-03-08
            • 1970-01-01
            • 2016-06-19
            • 2021-09-08
            相关资源
            最近更新 更多