Java: Bagaimana cara membagi string dengan pembatas dengan membatasi jumlah karakter dalam sebuah string?

Saya memiliki skenario di mana saya harus membagi string (yang memiliki nilai dipisahkan koma) membatasi jumlah maksimum karakter dalam string sambil mempertahankan format dipisahkan koma.

Misalnya, String str = "test,et,ste,ts,tst,est,ste,tstete,sts,tet,estst,tet"

Katakanlah jumlah maksimum karakter dalam sebuah string adalah 10. Maka output saya seharusnya:

test,et (7 chars)
ste,ts,tst (10 chars)
est,ste (7 chars)
tstete,sts (10 chars)
tet,estst (9 chars)
tet (3 chars)

Pada dasarnya output akan dilingkarkan dan ditambahkan ke klausa IN dalam kueri tetapi klausa IN hanya dapat menangani (jumlah karakter maksimum) jadi pisahkan string (dengan arti nilai yang dipisahkan koma penuh) jika panjang string melebihi batas.


person Devi    schedule 26.04.2019    source sumber
comment
Saya baru saja membagi dengan koma, lalu menggabungkan kembali string dengan cara yang tidak melebihi batasan ukuran Anda. Sebagai manfaat tambahan, jika Anda benar-benar mencari tantangan, Anda dapat mengatur ulang string menjadi optimal (yaitu mungkin bukan string yang berurutan pada input asal).   -  person mprivat    schedule 27.04.2019
comment
Apakah ini pekerjaan rumah?   -  person luksch    schedule 27.04.2019
comment
@luksch tidak, ini bukan pekerjaan rumah   -  person Devi    schedule 27.04.2019
comment
@mprivat saya memahami bagian pertama jawaban Anda tetapi tidak memahami bagian kedua. tidak perlu berurutan tetapi apakah Anda memiliki contoh kode untuk bergabung kembali dengan string[] dengan membatasi ukuran karakter?   -  person Devi    schedule 27.04.2019


Jawaban (3)


Anda dapat melakukan sesuatu seperti ini (lihat komentar untuk penjelasannya):

public static void main(String[] args) {
    String str = "test,et,ste,ts,tst,est,ste,tstete,sts,tet,estst,tet";

    // Split it first
    String words[] = str.split(",");

    // Use a buffer
    StringBuffer sb = new StringBuffer("");

    List<String> result = new ArrayList<>();

    String delim = "";

    // Iterate through the words. 
    for(int i = 0; i< words.length; i++) {
        // You will add the comma so total length should be less 
        // than 10.
        if(sb.length() + words[i].length() < 10) {
            sb.append(delim);
            sb.append(words[i]);
            delim = ",";
        }
        else {
            delim = "";
            result.add(sb.toString());
            System.out.println(sb.toString());
            sb = new StringBuffer(words[i]);
            delim = ",";
        }
    }

    // Print to check the results
    for(String s: result) {
        System.out.println(s);
    }
}
person Pritam Banerjee    schedule 26.04.2019
comment
Ini tidak memberi saya hasil persis yang saya harapkan. Kedua nilai yang dicetak memiliki nilai yang sama. Apakah ada cara agar kita bisa melakukannya tanpa membuat objek dan menggunakan fungsi indexof dan membuatnya sederhana? - person Devi; 30.04.2019

tugas ini rumit — ekspresi lambda berikut menyelesaikannya

comma = false; // class boolean variable
last = 0;      // class int variable

Stream.of( str.split( "," ) ).collect(
  Collector.of( () -> new StringBuilder(),
    (buf, s) -> {
      if( buf.length() - last + s.length() < 10 ) {
        buf.append( comma ? "," : "" ).append( s );
        comma = true;
      }
      else {
        int len = buf.length();
        buf.append( " (" ).append( len - last ).append( " chars)\n" );
        last = buf.length();
        buf.append( s );
      }
    },
    (buf1, buf2) -> null,  // unused
    buf -> {
      int len = buf.length();
      return( buf.append( " (" ).append( len - last ).append( " chars)\n" ).toString() );
    } ) );

dan tanpa penjelasan (… karakter):

Stream.of( str.split( "," ) ).collect(
  Collector.of( () -> new StringBuilder(),
    (buf, s) -> {
      if( buf.length() - last + s.length() < 10 ) {
        buf.append( comma ? "," : "" ).append( s );
        comma = true;
      }
      else {
        buf.append( '\n' );
        last = buf.length();
        buf.append( s );
      }
    },
    (buf1, buf2) -> null,  // unused
    buf -> {
      return( buf.append( '\n' ).toString() );
    } ) );

output yang diperlukan dikembalikan sebagai string…

person Kaplan    schedule 10.07.2019

Saya akan melakukan ini:

  1. pisahkan string input dengan koma. Anda mendapatkan kembali array dengan string tunggal, mis. arr[]
  2. inisialisasi variabel string sementara untuk menyimpan output, mis. out = ""
  3. loop di atas array, mis. for(int i = 0; i< arr.length; i++)
  4. di dalam loop: jika panjang keluar dikombinasikan dengan panjang entri array saat ini lebih kecil menjadi 10, maka tambahkan entri array saat ini ke keluar, jika tidak, cetak, setel ulang, dan lanjutkan, misalnya. if (out.length + arr[i].length < 10) {out += ","+arr[i];} else {print out; out = "";}

Mungkin saya lupa sesuatu... tapi Anda pasti mengerti maksudnya, bukan?

person luksch    schedule 26.04.2019
comment
Apakah ada cara agar kita bisa melakukannya tanpa membuat objek baru dan menggunakan fungsi indexof dan membuatnya sederhana? - person Devi; 30.04.2019
comment
solusi yang saya sarankan membuat satu objek pembantu, yaitu string. Itu tidak menggunakan indexOf, hanya properti panjang string, yang secara komputasi tidak mahal. Tentu saja Anda dapat alih-alih membuat string out (di mana solusi lain menyarankan penggunaan StringBuffer), Anda cukup menggunakan variabel count. Tambahkan panjang setiap entri array ke variabel count dan bandingkan dengan 10. Jika lebih besar, buatlah string. Tapi menurutku itu tidak jauh lebih elegan. - person luksch; 30.04.2019