Cara mengurutkan string (berisi nama dan umur) terlebih dahulu berdasarkan abjad dan kemudian berdasarkan umur dalam kelompok nama

Tugas saya: Ambil daftar awal, masukkan ke dalam file teks bernama "Names_ages.txt" dan gunakan pengurutan pilihan (tidak ada pengurutan lain) untuk mengurutkannya berdasarkan abjad. tetapi juga mengurutkan nama yang berulang berdasarkan usia. Usia berpindah dari yang termuda ke yang tertua.

Daftar awal (untuk diurutkan):

Jones 14

Abram 15

Smith 19

jones 9

Alexander 22

Smith 20

Smith 17

Tippurt 42

jones 2

Herkamn 12

Jones 11

Daftar yang sudah selesai (setelah pengurutan yang benar):

Abram 15

Alexander 22

Herkman 12

jones 2

jones 9

Jones 11

Jones 14

Smith 17

Smith 19

Smith 20

Tippurt 42

Kelas pemindai saya untuk membuat file teks menjadi array (tidak ada kesalahan, berfungsi dengan baik)

import java.util.*;
import java.io.*;

public class ScannerClass
{
    public static void main(String[] args)
    {
        ScannerClass.textFile();
    }
    public static void textFile()
    {
        String line;
        String[] names = new String[11];

        try(BufferedReader reader = new BufferedReader(new FileReader("Names_ages.txt")))
        {
            line = reader.readLine();

            for(int i = 0; i < 11; ++i)
            {
                names[i] = line;
                //System.out.println(names[i]);
                line = reader.readLine();
            }
        }
        catch(IOException e)
        {
            System.out.println(e.getMessage());
        }
        SortClass.selectionSort(names);
    }
}

Kelas pengurutan pilihan saya (saya memposting apa yang dicetaknya):

import java.util.*;
import java.io.*;

public class SortClass
{
    public static void selectionSort(String names[])
    {
        for(int i=0; i<names.length-1; ++i){
            int minIndex = i;
            for(int j=i+1; j<names.length; ++j)
            {
                if(names[j].compareTo(names[minIndex])<0)
                {
                    int indexChar1 = names[j].indexOf(' ');
                    int indexChar2 = names[minIndex].indexOf(' ');
                    String name1 = names[j].substring(0, indexChar1);
                    String name2 = names[minIndex].substring(0, indexChar2);
                    if(name1.equals(name2))
                    {
                        String number1 = names[j].substring(indexChar1+1); //names[j]
                        String number2 = names[minIndex].substring(indexChar2+1); //names[minIndex]
                        int num1 = Integer.parseInt(number1); //names[j]
                        int num2 = Integer.parseInt(number2); //names[minIndex]
                        if(num1>num2)
                            continue;
                        if(num1<num2)
                            minIndex = j;
                    }
                    else
                        minIndex = j;

                }
            }
            String temp = names[i];
            names[i] = names[minIndex]; 
            names[minIndex] = temp;
        }
        printNames(names);
    }

    public static void printNames(String names[])
    {
        for(int l=0; l<11; l++)
        {
            System.out.println(names[l]);
        }
    }
}

Apa yang saya cetak:

Abram 15

Alexander 22

Herkamn 12

jones 2

Jones 11 (Keduanya perlu diganti)

Jones 9

Jones 14

Smith 17

Smith 19

Smith 20

Tippurt 42

Saya tidak yakin bagaimana cara memperbaiki kesalahan jones, saya rasa yang dilakukan adalah menatanya secara berurutan, melainkan berpasangan, bukan hanya keempatnya. Bagaimana cara memperbaikinya agar Jones berada dalam urutan usia seperti daftar akhir di atas?


person HardlyTheJavaLegend    schedule 03.03.2017    source sumber


Jawaban (1)


Ini SortClass Anda setelah sedikit modifikasi. Ujilah dan beri tahu saya

import java.util.*;
import java.io.*;

public class SortClass
{
    public static void selectionSort(String names[])
    {
        for(int i=0; i<names.length-1; ++i){
            int minIndex = i;
            for(int j=i+1; j<names.length; ++j)
            {
                int indexChar1 = names[j].indexOf(' ');
                int indexChar2 = names[minIndex].indexOf(' ');
                String name1 = names[j].substring(0, indexChar1);
                String name2 = names[minIndex].substring(0, indexChar2);

                if(name1.compareTo(name2)<0)
                {
                    minIndex = j;
                } else if(name1.compareTo(name2) == 0){

                        String number1 = names[j].substring(indexChar1+1); //names[j]
                        String number2 = names[minIndex].substring(indexChar2+1); //names[minIndex]
                        int num1 = Integer.parseInt(number1); //names[j]
                        int num2 = Integer.parseInt(number2); //names[minIndex]
                        if(num1>num2)
                            continue;
                        if(num1<num2)
                            minIndex = j;

                }
            }
            String temp = names[i];
            names[i] = names[minIndex]; 
            names[minIndex] = temp;
        }
        printNames(names);
    }

    public static void printNames(String names[])
    {
        for(int l=0; l<11; l++)
        {
            System.out.println(names[l]);
        }
    }
}
person Karan Chadha    schedule 03.03.2017
comment
@HardlyTheJavaLegend - Ada kesalahan pada logika Anda, khususnya pada baris if(names[j].compareTo(names[minIndex])<0). Anda tidak dapat membandingkan keseluruhan baris. Logikanya seharusnya - Bandingkan nama (setelah pemisahan), jika names[j] (setelah pemisahan) secara leksikografis kurang dari names[minIndex] (setelah pemisahan) maka Anda memperbarui minindex, tanpa membandingkan angkanya. jika namanya sama HANYA MAKA Anda membandingkan usianya - person Karan Chadha; 03.03.2017