0

今日は面接の練習があります。

return ソートされた配列 (大文字と小文字を区別しない)。ソートされた配列がソートされます

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

私は 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;
    }

私のコードで何が間違っているのか教えてください。ありがとう

4

1 に答える 1

3

あなたの比較ロジックは明らかにあなたの仕様と一致していません。最初の 3 文字は完全に無視され、最初の 3 文字の後の数字以降はすべて無視されます。明らかに、これらのことを考慮する必要があります。そうしないと、仕様に一致することはありません。

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

これはあなたの仕様に一致します。取得した次の出力をテストしました。

AIR1
AIR1Z
AIR2 A
AIR10ab
AIR20AB
AIR20b
AIR111
BIR5A
于 2013-08-13T02:11:45.053 に答える