#java #csv #operating-system #scheduling
#java #csv #операционная система #планирование
Вопрос:
Итак, я пытаюсь отсортировать столбец по времени прибытия, чтобы первым было самое раннее время прибытия. Я новичок в файлах csv на Java, поэтому испытываю большие трудности.
Мне удалось прочитать файл csv и распечатать с использованием массива, но я не уверен, как отсортировать конкретный столбец
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class readCSV {
public static void main(String[] args) {
String fileName= "csv.csv";
File file= new File(fileName);
// this gives you a 2-dimensional array of strings
List<List<String>> lines = new ArrayList<>();
Scanner inputStream;
try{
inputStream = new Scanner(file);
while(inputStream.hasNext()){
String line= inputStream.next();
String[] values = line.split(",");
// this adds the currently parsed line to the 2-dimensional string array
lines.add(Arrays.asList(values));
//System.out.println(line);
System.out.println(values[0] ' ' values[1] ' ' values[2] ' ' values[3] );
}
inputStream.close();
}catch (FileNotFoundException e) {
e.printStackTrace();
}
// the following code lets you iterate through the 2-dimensional array
/*int lineNo = 1;
for(List<String> line: lines) {
int columnNo = 1;
for (String value: line) {
System.out.println("Line " lineNo " Column " columnNo ": " value);
columnNo ;
}
lineNo ;
}*/
}
}
Если есть какие-либо другие улучшения, такие как сохранение csv, его печать и т.д., Я с удовольствием это изменю
Вот пример ввода:
processID arrivalTime burstTime priority
1 0 5 1
2 1 7 2
3 0 2 1
4 2 6 2
5 6 10 3
6 5 4 4
7 6 4 7
8 5 4 8
9 6 6 3
10 6 7 2
Комментарии:
1. Возможно, вы захотите сохранить его в объекте, у которого есть map Map<Строка, String> и создать свой собственный метод сортировки объекта. Таким образом, вы можете легко отсортировать его, когда он находится в списке. (Если у вас есть немного времени, я создам код и загружу его в качестве ответа)
2. да, у меня есть время, я попробую сделать это с помощью карты, но был бы очень признателен за просмотр вашего кода
3. Извините, что это заняло так много времени, но я опубликовал ответ ниже 🙂 Я надеюсь, что это поможет вам!
4. спасибо, не беспокойтесь. Думаю, я понял, но где бы мне тогда использовать имеющийся у меня csv-файл, например, в примере выше
5. просто скопируйте мою часть под ‘String[] lineValues = s.split(«,»);’ и замените часть, которая находится под вашими ‘String[] values …’ 🙂
Ответ №1:
Я надеюсь, что приведенный ниже код поможет вам 🙂
Что я делаю, я сначала создаю для каждой строки объект. После этого я сравниваю каждый объект с ключом той строки, с которой я хочу его сравнить. Таким образом, вы можете выбрать свой «CSV-ключ», который вы тоже хотите сравнить.
Вы можете использовать этот код, но помните, что я вставил туда 2 ‘TODO’, это будут возможные исключения с нулевым указателем, если вы не учитываете их 🙂
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author runef
*/
public class Test {
public static void main(String[] args) {
new Test();
}
private List<CoolObject> coolObjects = new ArrayList<>();
private String[] linesOfCSV = {"A,B,C,D", "1,2,A,A", "2,1,B,B"};
public Test() {
String[] keys = null;
for (String s : linesOfCSV) {
String[] lineValues = s.split(",");
if (keys == null) {
keys = lineValues;
} else {
Map<String, String> aGoodName = new HashMap<>();
for (int i = 0; i < lineValues.length; i ) {
//TODO: Check if keys[i] exists, check if lineValues[i] exists (if not probs something wrong with CSV)
aGoodName.put(keys[i], lineValues[i]);
}
coolObjects.add(new CoolObject(aGoodName));
}
}
Collections.sort(coolObjects, new SortByKey("A"));
System.out.println("SORTED BY KEY 'A'");
for (CoolObject o : coolObjects) {
for (Map.Entry<String, String> entry : o.getACoolMap().entrySet()) {
System.out.print(entry.getKey() ": " entry.getValue() " ");
}
System.out.print("n");
}
Collections.sort(coolObjects, new SortByKey("B"));
System.out.println("SORTED BY KEY 'B'");
for (CoolObject o : coolObjects) {
for (Map.Entry<String, String> entry : o.getACoolMap().entrySet()) {
System.out.print(entry.getKey() ": " entry.getValue() " ");
}
System.out.print("n");
}
}
class CoolObject {
private Map<String, String> aCoolMap;
public CoolObject(Map<String, String> aCoolMap) {
this.aCoolMap = aCoolMap;
}
public Map<String, String> getACoolMap() {
return aCoolMap;
}
}
class SortByKey implements Comparator<CoolObject> {
private String keySorter;
public SortByKey(String keySorter) {
this.keySorter = keySorter;
}
public int compare(CoolObject a, CoolObject b) {
//TODO: CHECK IF KEY EXISTS IN BOTH VALUES! ELSE DO SOMETHING ELSE :) PROBS RETURN -1 SO IT COMES LAST!
return a.getACoolMap().get(this.keySorter).hashCode() - b.getACoolMap().get(this.keySorter).hashCode();
}
}
}
Ответ №2:
Это приведет к сортировке одного столбца .. вы можете изменить его для нескольких столбцов..
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class Test {
public static void main(String[] args) throws IOException {
ArrayList<String> list = new ArrayList<>();
int lineNumber = 0;
File csvFile = new File("D://new.csv");
BufferedReader br = new BufferedReader(new FileReader(csvFile));
String line = "";
while ((line = br.readLine()) != null) {
String[] arr = line.split(",");
list.add(arr[0]);
lineNumber ;
}
Collections.sort(list);
list.forEach(i -> System.out.println(i));
}
}
Комментарии:
1. приветствия, я имею в виду, что это вроде как сработало. Он также отсортировал заголовок столбца csv и имел 10 не на своем месте, это был результат: 1 10 2 3 4 5 6 7 8 9 ProcessId