تقسيم السلسلة في جافا إلى قطع طول ثابت

لدى سبع سلاسل في برنامج المسمى string1 خلال string7.

سيكون حجم كل سلسلة 30 حرفًا.

سوف أحصل على سلسلة إدخال غير معروفة الطول.

لا بد لي من تقسيم هذه السلسلة المدخلة في 30 سلاسل char ثم قم بتعيين السلسلة الفرعية الأولى في string1 و الثاني في string2 وهكذا حتى ممكن. إذا كانت سلسلة الإدخال أكبر من 210 حرفًا ، فسيتم تجاهل السلسلة المتبقية في النهاية.

كيفية التعامل مع الحالة عندما تكون سلسلة الإدخال أصغر حجمًا ثم 210 حرفًا.

على سبيل المثال 145 في هذه الحالة ، سيكون string1 إلى string4 ممتلئًا ، وسيتم إجراء string5 من 15 حرفًا متبقيًا.

كيفية التعامل مع هذا جيد؟

أستطيع أن أفعل ذلك بقراءة شار من شار ووضع أول 30 شار و string1 ، القادم في string2 ، وما إلى ذلك حتى يتم استهلاكها جميع شار.

ولكن هل هناك طريقة أفضل للقيام بذلك؟

3

9 إجابة

If you can use third-party libraries, with Guava this is just

Iterable chunks = Splitter.fixedLength(30).split(string);

This can be converted to a List with e.g. Lists.newArrayList.

(الكشف: أساهم في الجوافة).

10
وأضاف
لا أستطيع استخدام الجوافة. أيضا ، يمكن أن يكون Iterable من أي حجم بين 1 و 7. كيفية تعيين string1 من خلال string7 من Iterable. لاحظ أن string1 عبر string7 مستقلة عن بعضها البعض.
وأضاف المؤلف Nik, مصدر
يبدو ممكن. يرجى الاطلاع على إجابة مايكل.
وأضاف المؤلف Nik, مصدر
يا! حسنا! شكر!
وأضاف المؤلف Nik, مصدر
إذا كان عليك إخراجهم إلى سبعة متغيرات مختلفة ، فلن يكون أمامك أي خيار سوى القيام بذلك باليد. إذا كان بإمكانك استخدام صفيف ، فهذا يمنحك المزيد من المرونة ، ولكن إذا كان لديك سبعة متغيرات مختلفة ، فلا توجد طريقة سهلة للقيام بذلك.
وأضاف المؤلف Louis Wasserman, مصدر
هذا ما أعنيه بالقيام به باليد.
وأضاف المؤلف Louis Wasserman, مصدر

نظرًا لأن سلاسلك ليست في صفيف أو قائمة ، فستحتاج إلى تعيينها بشكل واضح.

    Matcher m = Pattern.compile(".{1,30}").matcher(s);
    String s1 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s2 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s3 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s4 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s5 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s6 = m.find() ? s.substring(m.start(), m.end()) : "";
    String s7 = m.find() ? s.substring(m.start(), m.end()) : "";
4
وأضاف
أنيق! شكرا جزيلا.
وأضاف المؤلف Nik, مصدر

هذا شيء يجب أن يعمل:

 String str = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
        if (str.length() > 210)
        {
            str =  str.substring(0, 209);
        }
        String newStr  = str.replaceAll("(.{30})", "$1|");
        System.out.println(newStr);
        String[] newStrings = newStr.split("\\|");

ما يفعله هو أنه يأخذ السلسلة المعطاة وفي كل 30 حرفًا ، فإنه يرمي في جهاز فصل. في هذه الحالة ، أفترض أن لديك فكرة عما سيقوم المستخدم بإدخاله وما لا يمكن أن يرميه في أحد الفواصل (أو مجموعة من أجهزة الفصل) التي لن يدخلها المستخدم. وبمجرد أن أفعل ذلك ، قمت بتقسيم السلسلة باستخدام أداة الفصل التي قمت للتو بإضافتها.

2
وأضاف

ماذا عن استخدام مصفوفة char لتقسيم السلسلة ، إنشاء طريقة الاستخدام العام تلقي حجم القطعة والحجم الأقصى للنظر ، وإرجاع مصفوفة سلسلة؟

public class SplitStringIntoFixedSizeChunks {

    public static String[] Split(String text, int chunkSize, int maxLength) { 
        char[] data = text.toCharArray();       
        int len = Math.min(data.length,maxLength);
        String[] result = new String[(len+chunkSize-1)/chunkSize];
        int linha = 0;
        for (int i=0; i < len; i+=chunkSize) {
            result[linha] = new String(data, i, Math.min(chunkSize,len-i));
            linha++;
        }
        return result;
    }

    public static void main(String[] args) { 
        String x = "flskdafsld~fdsakçkçfsda sfdaldsak~çfdskkfadsçlkçfldskçlflçfdskçldksçlkfdslçakafdslçdsklçfdskçlafdskçkdfsçlkfds~çlkfasdçlçfdls~kçlf~dksçlsakdçlkfç";
        System.out.println("x length: "+x.length());
        String[] lines = Split(x, 30, 210);
        for (int i=0; i < lines.length; i++) {
            System.out.println("lines["+i+"]: (len: "+lines[i].length()+") : "+lines[i]);
        }
    }
}

هذا المثال النتائج:

x length: 145
lines[0]: (len: 30) : flskdafsld~fdsakçkçfsda sfdald
lines[1]: (len: 30) : sak~çfdskkfadsçlkçfldskçlflçfd
lines[2]: (len: 30) : skçldksçlkfdslçakafdslçdsklçfd
lines[3]: (len: 30) : skçlafdskçkdfsçlkfds~çlkfasdçl
lines[4]: (len: 25) : çfdls~kçlf~dksçlsakdçlkfç
2
وأضاف
private static Collection splitStringBySize(String str, int size) {
    ArrayList split = new ArrayList<>();
    for (int i = 0; i <= str.length()/size; i++) {
        split.add(str.substring(i * size, Math.min((i + 1) * size, str.length())));
    }
    return split;
}
2
وأضاف

هذا قد يساعدك.

public static void main(String args[]) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String st = br.readLine();
            int len = st.length();
            String[] str = new String[7];
            len=len/30;
            int i=0;
            for(; i<7 && i
1
وأضاف

وهذا هو ما فعلته. يبدو أنه يعمل. يرجى التعليق إذا كنت مخطئا في أي مكان:

package com.mypackage;

import java.util.ArrayList;
import java.util.List;


public class TestClass {

public static List splitEqually(final String text, final int size) {

    List ret = new ArrayList((text.length() + size - 1)/size);
    for (int start = 0; start < text.length(); start += size) {

        if (start + size > 0) {

            String temp = text.substring(start, Math.min(text.length(), start + size));
            int length = temp.length();

            for (int i = 0; i < (size - length); i++) {
                temp = temp + " ";
            }

            ret.add(temp);

        } else {
            ret.add(text.substring(start, Math.min(text.length(), start + size)));
        }


    }
    return ret;
}

public static void main(final String args[]) {

    String input = "hello wo";

    String str1, str2, str3, str4, str5;

    List result = TestClass.splitEqually(input, 3);

    try {
        str1 = result.get(0);
        System.out.println("1: " + result.get(0));

        str2 = result.get(1);
        System.out.println("2: " + result.get(1));

        str3 = result.get(2);
        System.out.println("3: " + result.get(2));

        str4 = result.get(3);
        System.out.println("4: " + result.get(3));

        str5 = result.get(4);
        System.out.println("5: " + result.get(4));

    } catch (IndexOutOfBoundsException e) {
    }

}
}
0
وأضاف
import java.util.ArrayList;


public class Test {

public static void main(String[] args) {

   //your input
    String input = "";

   //strings 1-7 as array list
    ArrayList results = new ArrayList();

    int length;

    if(input.length() > 210) {

        length = 210;

    } else {

        length = input.length();

    }

    for(int i = 0; i <= length; i += 30) {

        if((length - (i + 30)) > 0) {

            results.add(input.substring(i, i + 30));

        } else {

            results.add(input.substring(i, length));

        }

    }

    for(int a = 0; a < results.size(); a++) {

        System.out.println("size: " + results.get(a).length() + " content: " + results.get(a));

    }

    }

    }
0
وأضاف

واجهت مشكلة مع استخدام محدد لهذه التقنية. كان المستخدم يقوم بنسخ/لصق محتوى M $ Word في حقل HTML تم التقاطه في النهاية بواسطة هذه التقنية ليتم تقسيمها إلى حقول قاعدة بيانات متعددة.

انقسمت التقنية ضد استخدام M $ Word لعودة الإرسالات وأحرف ASCII الأخرى. سوف يقوم REGEX بتقسيم كل حرف إرجاع بدلاً من عدد محدد من الأحرف. لتصحيح المشكلة ، عدلت شفرة Michael Besteck إلى ما يلي:

Matcher m = Pattern.compile(".{1,30}", Pattern.DOTALL).matcher(s);
String s1 = m.find() ? s.substring(m.start(), m.end()) : "";
String s2 = m.find() ? s.substring(m.start(), m.end()) : "";
String s3 = m.find() ? s.substring(m.start(), m.end()) : "";
String s4 = m.find() ? s.substring(m.start(), m.end()) : "";
String s5 = m.find() ? s.substring(m.start(), m.end()) : "";
String s6 = m.find() ? s.substring(m.start(), m.end()) : "";
String s7 = m.find() ? s.substring(m.start(), m.end()) : "";

هذه الحسابات من أجل أحرف ASCII بشكل صحيح.

0
وأضاف