วิธีจัดเรียงสตริง (ประกอบด้วยชื่อและอายุ) ตามลำดับตัวอักษรก่อนแล้วจึงเรียงลำดับตามอายุภายในกลุ่มชื่อ

งานมอบหมายของฉัน: นำรายการเริ่มต้น ใส่ไว้ในไฟล์ข้อความชื่อ "Names_ages.txt" และใช้ การเรียงลำดับการเลือก (ไม่มีการเรียงลำดับอื่น) เพื่อเรียงลำดับตามตัวอักษร แต่ยังเรียงลำดับชื่อซ้ำตามอายุด้วย อายุเริ่มจากน้อยไปหามาก

รายการเริ่มต้น (ที่จะเรียงลำดับ):

โจนส์ 14

อับรามส์ 15

สมิธ 19

โจนส์ 9

อเล็กซานเดอร์ 22

สมิธ 20

สมิธ 17

ทิปเพิร์ต 42

โจนส์ 2

แฮร์คัมน์ 12

โจนส์ 11

รายการที่เสร็จสิ้นแล้ว (หลังการเรียงลำดับที่ถูกต้อง):

อับรามส์ 15

อเล็กซานเดอร์ 22

เฮิร์คแมน 12

โจนส์ 2

โจนส์ 9

โจนส์ 11

โจนส์ 14

สมิธ 17

สมิธ 19

สมิธ 20

ทิปเพิร์ต 42

คลาสสแกนเนอร์ของฉันเพื่อทำให้ไฟล์ข้อความเป็นอาร์เรย์ (ไม่มีข้อผิดพลาดทำงานได้ดี)

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);
    }
}

คลาสการเรียงลำดับการเลือกของฉัน (ฉันโพสต์สิ่งที่พิมพ์ออกมา):

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]);
        }
    }
}

สิ่งที่พิมพ์ออกมา:

อับรามส์ 15

อเล็กซานเดอร์ 22

แฮร์คัมน์ 12

โจนส์ 2

Jones 11 (ต้องเปลี่ยนสองตัวนี้)

โจนส์ 9

โจนส์ 14

สมิธ 17

สมิธ 19

สมิธ 20

ทิปเพิร์ต 42

ฉันไม่แน่ใจว่าจะแก้ไขโจนส์ที่เลอะเทอะได้อย่างไร ฉันเดาว่า กำลัง ทำให้มันเป็นระเบียบ แต่เป็นคู่มากกว่าแค่สี่อัน ฉันจะแก้ไขอย่างไรเพื่อให้โจนส์เรียงลำดับตามอายุเหมือนกับรายการที่เสร็จสิ้นด้านบน


person HardlyTheJavaLegend    schedule 03.03.2017    source แหล่งที่มา


คำตอบ (1)


นี่คือ SortClass ของคุณหลังจากการแก้ไขเล็กน้อย ทดสอบแล้วแจ้งให้ทราบครับ

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 - มีข้อผิดพลาดในตรรกะของคุณ โดยเฉพาะในบรรทัด if(names[j].compareTo(names[minIndex])<0) คุณไม่สามารถเปรียบเทียบทั้งบรรทัดได้ ตรรกะควรเป็น - เปรียบเทียบชื่อ (หลังจากแยก) ถ้า names[j] (หลังจากแยก) น้อยกว่า names[minIndex] (หลังแยก) ตามพจนานุกรม คุณจะต้องอัปเดต minindex โดยไม่ต้อง เปรียบเทียบตัวเลข ถ้าชื่อเท่ากัน เท่านั้น คุณจะเปรียบเทียบอายุ - person Karan Chadha; 03.03.2017