سؤال

أنا أستخدم StringBuffer في Java لربط السلاسل معًا، كما يلي:

StringBuffer str = new StringBuffer();

str.append("string value");

أود معرفة ما إذا كانت هناك طريقة (على الرغم من أنني لم أجد أي شيء من خلال نظرة سريعة على الوثائق) أو طريقة أخرى لإضافة "الحشوة".

دعني أشرح؛في كل مرة أقوم فيها بإلحاق شيء ما بالسلسلة، أريد إضافة مسافة في النهاية، كما يلي:

String foo = "string value";
str.append(foo + " ");

ولدي عدة دعوات لإلحاقها..وفي كل مرة، أريد إضافة مسافة.هل هناك طريقة لتعيين الكائن بحيث يضيف مسافة تلقائيًا بعد كل إلحاق؟

يحرر --

String input
StringBuffer query = new StringBuffer();
Scanner scanner = new Scanner(System.in);
scanner.UseDelimiter("\n");

do {
   System.out.println("sql> ");

   input = scanner.next();

   if (!empty(input)) query.append(input);

   if (query.toString().trim().endsWith(";")) {
         //run query
   }
}
while (!input.equalsIgnoreCase("exit");

سأستخدم StringBuilder كما اقترح جروم، ولكن هكذا يبدو الكود الآن

هل كانت مفيدة؟

المحلول

أعتقد أن التعامل مع هذا الأمر أسهل إما باستخدام طريقة مساعدة (رمز لم يتم اختباره):

public String myMethod() {
    StringBuilder sb = new StringBuilder();
    addToBuffer(sb, "Hello").addToBuffer("there,");
    addToBuffer(sb, "it").addToBuffer(sb, "works");
}

private StringBuilder addToBuffer(StringBuilder sb, String what) {
    return sb.append(what).append(' ');  // char is even faster here! ;)
}

أو حتى استخدام نمط منشئ بواجهة سلسة (رمز لم يتم اختباره أيضًا):

public String myMethod() {
    SBBuilder builder = new SBBuilder()
        .add("Hello").add("there")
        .add("it", "works", "just", "fine!");

    for (int i = 0; i < 10; i++) {
        builder.add("adding").add(String.valueOf(i));
    }

    System.out.println(builder.build());
}

public static class SBBuilder {
    private StringBuilder sb = new StringBuilder();

    public SBBuilder add(String... parts) {
        for (String p : parts) {
            sb.append(p).append(' '); // char is even faster here! ;)
        }
        return this;
    }

    public String build() {
        return sb.toString();
    }
}

هنا شرط حول هذا الموضوع.

نأمل أن يساعد!:)

نصائح أخرى

يجب أن تستخدم StringBuilder.

حيثما أمكن، يوصى باستخدام هذه الفئة بدلاً من StringBuffer لأنها ستكون أسرع في معظم التطبيقات.

StringBuffer نهائي.لا يمكنك أن تستمد منه.الحل الأفضل حقًا هو إضافة الحشوة لنفسك.اكتب طريقة لذلك واستخدم PADDING-Constant بحيث يمكنك تغييره بسهولة، أو من الأفضل وضعه في معلمة.

ألا يمكنك إنشاء فئة جديدة تلتف حولها StringBuffer وإضافة appendWithTrailingSpace() طريقة؟

CustomStringBuffer str = new CustomStringBuffer();
str.appendWithTrailingSpace("string value");

(على الرغم من أنك قد ترغب في تسمية طريقتك بشيء أقصر قليلاً.)

ما عليك سوى إضافة المساحة بنفسك، فالأمر سهل بما فيه الكفاية، وفقًا لمثالك الخاص.

الاحتمال الآخر هو أن كائنات StringBuilder تعود بنفسها عند استدعاء الإلحاق، مما يعني أنه يمكنك القيام بما يلي:

str.append("string value").append(" ");

ليس بنفس السهولة، لكنه على الأرجح حل أسهل من طريقة + " ".

الاحتمال الآخر هو إنشاء فئة مجمعة، مثل PaddedStringBuilder، والتي توفر نفس الأساليب ولكنها تطبق الحشو الذي تريده، حيث لا يمكنك أن ترث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top