Java mengurutkan array string (dicampur dengan angka dan karakter) [duplikat]

Sep 18 2020

Saya sedang mengurutkan array di Java, masukan saya adalah {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"} dan Saya mau keluaran {"a2", "a3", "a11", "b1", "b2", "b3", "c2", "c3", "c13"}

Apa yang saya lakukan di bawah ini tidak memberikan hasil yang tepat, saran / contoh kode apa pun dihargai

import java.util.Arrays;  

public class Main
{
    public static void main(String[] args) {
        String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3",  "c13", "c2"};  
        Arrays.sort(var);  
        System.out.println(Arrays.toString(var));  
    }
}

Dari kode di atas saya mendapatkan output [a11, a2, a3, b1, b2, b3, c13, c2, c3]

Jawaban

1 WJS Sep 18 2020 at 21:18

Inilah pendekatan yang relatif sederhana. Namun, untuk sesuatu seperti ini saya akan membuat kelas untuk menyimpan bagian alfa dan numerik secara terpisah dan menulis pembanding. Ketika saya mencetak objek, saya hanya akan toString()mengembalikan nilai aslinya.

Ini dasar. Itu tidak memeriksa string yang salah format.

String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3",  "c13", "c2"};  

Comparator<String> comp = (a,b)->{
      // split the strings between the last char and the first digit 
      String[] v1 = a.split("(?<!\\d)(?=\\d)");
      String[] v2 = b.split("(?<!\\d)(?=\\d)");
      
      // convert each integer part to an int.
      int n1 = Integer.valueOf(v1[1]);
      int n2 = Integer.valueOf(v2[1]);

      // compare each and get the result
      int r1 = v1[0].compareTo(v2[0]);
      int r2 = Integer.compare(n1,n2);

      // first sort on r1 (the strings).  If they are equal ( r1 == 0) 
      // then sort on the result of comparing the integers.
      return r1 == 0 ? r2 : r1;
};

Array.sort tidak mengambil pembanding sehingga Anda perlu mengonversi array ke daftar dan mengurutkannya. Ini juga akan mengubah array sejak array objek mencadangkan daftar yang dikembalikan dari Arrays.asList.

      
Collections.sort(Arrays.asList(var),comp);
System.out.println(Arrays.toString(var)); 

Cetakan

[a2, a3, a11, b1, b2, b3, c2, c3, c13]