【问题标题】:How to sort strings (containing a names and age) first alphabetically and then by age within name groups如何首先按字母顺序对字符串(包含名称和年龄)进行排序,然后在名称组中按年龄排序
【发布时间】:2017-03-03 03:21:15
【问题描述】:

我的任务:取出初始列表,将其放入名为“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

我不确定如何解决 jones 的问题,我猜是 将它们整理好,而不是全部四个。我将如何解决它,以便琼斯按照上面完成的列表按年龄顺序排列?

【问题讨论】:

    标签: java arrays string sorting selection


    【解决方案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]);
            }
        }
    }
    

    【讨论】:

    • @HardlyTheJavaLegend - 您的逻辑有误,特别是在if(names[j].compareTo(names[minIndex])&lt;0) 行中。你不能比较整行。逻辑应该是 - 比较名称(拆分后),如果names[j](拆分后)按字典顺序小于names[minIndex](拆分后),则更新minindex不进行比较数字。如果名字相等只有那么你比较年龄
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2019-06-25
    • 2019-02-23
    • 2021-02-17
    • 2014-01-10
    • 2021-12-28
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多