java - 如何在名称组中首先按字母顺序然后按年龄对字符串(包含名称和年龄)进行排序

标签 java arrays string sorting selection

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

我不知道如何解决琼斯的困惑,我猜它正在将它们按顺序排列,而是成对排列,而不是全部四个。我该如何修复它,以便琼斯按照年龄顺序排列,就像上面的最终列表一样?

最佳答案

这是经过细微修改后的 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]);
        }
    }
}

关于java - 如何在名称组中首先按字母顺序然后按年龄对字符串(包含名称和年龄)进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42570050/

相关文章:

java - 在类型 'httpServletRequest' 的对象上找不到属性或字段 'org.springframework.webflow.engine.impl.RequestControlContextImpl'

c++ - 指向 int 数组的指针给出与取消引用时相同的地址

Java 字符串 UTF-8 限制

c# - 在 C# 中替换字符串中的 unicode 字符

c++ - string.find ("") 找不到空格

java - 使用代码终止 Eclipse(在 Java 中)

java - 精简计算器程序

java - 使用 Java lambda 表达式替换自定义列表搜索

javascript - 如何从多个数组中提取来构建列表?

javascript - jQuery 删除数组索引