![](/img/trans.png)
[英]How can I make Spring Data MongoDB sort Java Sets when saving as arrays?
[英]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.