簡體   English   中英

如何對Java數據集進行排序

[英]How to sort data sets 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);       
    }
}

我猜想您要制作類並以某種方式對數據進行排序,但我不知道從哪里開始。

我建議為包含合適成員的車輛創建一個類,在您的情況下,三個類型為String而一個類型為int ,即Price 然后,將為從文本文件讀取的每一行生成一個新實例,以填充成員。 新實例應放入容器中。 您還必須實現一個可以確定實例順序的比較器-在您的情況下,它將檢查兩個實例的Price並返回差值。

這是我發現可比的例子

     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 Ename哈里·薩爾20000.0

EmpID 0 Ename湯姆Sal40000.0

EmpID 2 Ename瑪姬Sal50000.0

EmpID 3 Ename克里斯·薩爾70000.0

首先,讓我們將文件中的行解析為Car對象,而不是將它們放入一個大的String中:

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的compare方法(請參見上面的鏈接),它會顯示:

比較其兩個參數的順序。 當第一個參數小於,等於或大於第二個參數時,返回負整數,零或正整數。

因此,如果第一個參數小於第二個參數,我們必須返回一個負整數:

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,否則上面的代碼將只打印汽車的對象引用。

嘗試這個:

測試並執行。 為了實現這一點, 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
    }
}
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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM