Saya mencoba menerapkan di sini arraylist dengan nilai tertinggi yang dimiliki setiap orang. Saya perlu membaca file teks dan memilah baris dengan nama dan nilai orang dari sana.

Setelah menyortir namesWithGrades output terlihat seperti ini:

[David Doe 3, Carol White 3, Bob Brown 4, Bob Brown 4, Alice Smith 4, David Doe 4, Alice Smith 5, Bob Brown 5]

Output yang diinginkan akan terlihat seperti ini dalam urutan apa pun:

[Carol White 3, David Doe 4, Alice Smith 5, Bob Brown 5]

Pertanyaan saya adalah, bagaimana saya bisa membandingkan nama dan nilai di namesWithGrade arraylist untuk mendapatkan hasil yang diinginkan untuk arraylist result?

Kode utama saya sejauh ini:

public List<String> getFullNamesWithHighestGrade() {
        readLines();
        List<String> namesWithGrade = new ArrayList<>();
        List<String> result = new ArrayList<>();
        for(String person: dataOrig){
            String[] data = person.split("\\|");
            namesWithGrade.add(data[0] + " " + data[1] + " " + data[3]);
        }
        namesWithGrade.sort(Comparator.comparing(s -> s.split(" ")[2]));
        System.out.println(namesWithGrade);
        
        return result;
    }

Membaca data dari file grades.txt:

private static final String FILE_PATH = "src/ex1/grades.txt";
    public List<String> dataOrig;

    private List<String> readLines() {
        try {
            dataOrig = Files.readAllLines(Paths.get(FILE_PATH));
            return dataOrig;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

File Grades.txt:

Alice|Smith|math|5
Bob|Brown|english|4
David|Doe|math|3
Bob|Brown|math|4
Bob|Brown|chemistry|5
Alice|Smith|english|4
Carol|White|chemistry|3
David|Doe|chemistry|4
0
Meowz 5 April 2021, 09:42

1 menjawab

Jawaban Terbaik

Buat hashmap. Berikut adalah contoh bagaimana mungkin:

HashMap<String, Integer> results = new HashMap<String, Integer>();

for(String person: dataOrig) {
    String[] data = person.split(“\\|”);
    String currentName = data[0] + “ “ + data[1]; //get the name of the current line
    int currentGrade = Integer.parseInt(data[3]); //get the grade of the current line 
    if(results.containsKey(currentName)) { //if the name is in the HashMap with a grade
        if(currentGrade > results.get(currentName)) { //if the current grade is greater than the one that is already in the HashMap, replace it.
            results.put(currentName, currentGrade);
        }
    }
    else //if the name hasn’t been added to the HashMap yet, put it in.
        results.put(currentName, currentGrade);
}

Hashmap sekarang harus berisi nama dengan nilai tertinggi yang benar. Tidak perlu menggunakan 2 arraylist. Anda dapat mencetak hasilnya dengan loop ini. Untuk mengurutkan hashmap berdasarkan nilai, periksa tautan ini: https://www.google.com/amp/wwww.geeksforgeeks.org/sorting-a-hashmap-according-be-values/amp/

for(Map.Entry<String, Integer> entry : results.entrySet()) {
    System.out.println(entry.getKey() + “ “ + entry.getValue());
}
0
LuckyBandit74 5 April 2021, 13:31