如何按字母顺序排序字符串(包含名称和年龄),然后按名称组中的年龄排序

时间:2017-03-03 03:21:15

标签: java arrays string sorting selection

我的归档:获取初始列表,将其放入名为" Names_ages.txt"的文本文件中。并使用选择排序(没有其他类型)按字母顺序对其进行排序。但也按年龄排序重复名称。年龄从最小到最老。

初始列表(待排序):

Jones 14

Abrams 15

史密斯19

琼斯9

Alexander 22

史密斯20

史密斯17

Tippurt 42

琼斯2

Herkamn 12

琼斯11

完成列表(正确排序后):

Abrams 15

Alexander 22

Herkman 12

琼斯2

琼斯9

琼斯11

Jones 14

史密斯17

史密斯19

史密斯20

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

我打印的是什么:

Abrams 15

Alexander 22

Herkamn 12

琼斯2

琼斯11 (这两个需要切换)

琼斯9

Jones 14

史密斯17

史密斯19

史密斯20

Tippurt 42

我不确定如何修复琼斯搞砸了,我猜它 将它们整理好,而不是成对而不是全部四个。我如何修复它,以便琼斯在年龄方面按顺序排列,就像上面的完成列表一样?

1 个答案:

答案 0 :(得分:2)

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