简体   繁体   English

包含数字的字符串排序数组

[英]sort array of strings that contain numbers

I have an interview exercise today: 我今天有一个面试练习:

return A sorted array (case insensitive). 返回一个排序数组(不区分大小写)。 A sorted array will be sorted 排序后的数组将被排序

 * alphabetically by the first 3 characters, then numerically by 
 * the following number and then alphabetically by the remaining characters with
 * spaces above characters.


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

import org.junit.Test;

public class MySort {


    public String[] testSortArray(String[] input){
        // TODO: Sort the array

    }

    @Test
    public void testSort() {
        String[] input = new String[8];
        input[0] = "AIR1";
        input[1] = "AIR20b";
        input[2] = "BIR5A";
        input[3] = "AIR20AB";
        input[4] = "AIR10ab";
        input[5] = "AIR2 A";
        input[6] = "AIR111";
        input[7] = "AIR1Z";

        MySort sortTest = new MySort();
        String[] output = sortTest.testSortArray(input);

        String[] expected = new String[8];
        expected[0] = "AIR1";
        expected[1] = "AIR1Z";
        expected[2] = "AIR2 A";
        expected[3] = "AIR10ab";
        expected[4] = "AIR20AB";
        expected[5] = "AIR20b";
        expected[6] = "AIR111";
        expected[7] = "BIR5A";
        assertEquals(Arrays.asList(output), Arrays.asList(expected));

        for (String item : output) {
            System.out.println(item);
        }
    }
}

I have implemented testSortArray(String[] input as : 我已经将testSortArray(String []输入实现为:

public String[] testSortArray(String[] input){

        Collections.sort(Arrays.asList(input), new Comparator<String>() {
            public int compare(String o1, String o2) {
                return extractNumber(o1) - extractNumber(o2);
            }

            int extractNumber(String s) {
                String num = s.replaceAll("\\D", "");
                // return 0 if no digits found
                return num.isEmpty() ? 0 : Integer.parseInt(num);
            }
        });
        return input;
    }

Can you please tell me what's wrong in my code ? 您能告诉我我的代码有什么问题吗? thanks 谢谢

Your comparison logic obviously doesn't come close to matching your spec. 您的比较逻辑显然不符合您的规格。 It completely ignores the first three characters, and ignores everything after the digit after the first three characters. 它完全忽略前三个字符,并忽略前三个字符后的数字之后的所有内容。 Clearly you need to take these things into consideration or you can never match your spec: 显然,您需要考虑以下因素,否则您将永远无法符合规格:

    public int compare(String o1, String o2) {
            String s1 = o1.substring(0, 3);
            String s2 = o2.substring(0, 3);
            if(!s1.equals(s2)) {
                return s1.compareTo(s2);
            }
            String[] fields1 = o1.substring(3).split("[^0-9]", 2);
            String[] fields2 = o2.substring(3).split("[^0-9]", 2);
            int i1 = Integer.parseInt(fields1[0]);
            int i2 = Integer.parseInt(fields2[0]);
            if(i1 != i2) {
                return i1 - i2;
            }
            String r1 = "";
            if(fields1.length > 1) {
                r1 = fields1[1];
            }
            String r2 = "";
            if(fields2.length > 1) {
                r2 = fields2[1];
            }
            return r1.compareTo(r2);
        }

This will match your spec. 这将符合您的规格。 I tested an obtained the following output: 我测试了获得以下输出:

AIR1
AIR1Z
AIR2 A
AIR10ab
AIR20AB
AIR20b
AIR111
BIR5A

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM