سؤال

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

تحديث:أنا باستخدام جافا ، ولكن إذا كان هناك حل عام إلى الهروب سلسلة التي سوف تكون محل تقدير كبير جدا.

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

المحلول

وربما يكون أحد الحلول لكتابة كامل ملف جنون يبس ووضع في الرموز الخاصة التي تحتاج لتحل محلها عبارة التي يتم اختيارها.

<اقتباس فقرة>   

وكنت فقط اشترى العلامة التجارية الجديدة $ {NOUN1}،   وهو الذهاب الى $ {VERB1} لك.

وبعد ذلك يمكنك استخدام على سبيل المثال: String.replace("${NOUN1}", noun1) لجميع الكلمات

نصائح أخرى

وما اللغة الذي تستخدمه؟

وومعظم لغات المستوى العالي لديهم ما يشبه:

String.Format("{0} {1} {2} {3}", word1, word2, word3, word4);

هناك طريقتان أستطيع أن أرى تماما تجنب سلسلة في اللعبة:

  1. متجر قالب القصة كما مجموعة من الرموز:أجزاء ثابتة و كلمة النائبة.ثم حلقة من خلال جمع إخراج أجزاء ثابتة المستخدم كلمة بدلا من كلمة النائبة.

  2. كتابة مخصص طباعة فئة حلقة من خلال قالب سلسلة باستخدام charAt و إخراج الكلمات بدلا من كلمة النائبة.

وبدلا من الدعوة String.replace لكل كلمة أو إلحاق لب StringBuilder باستمرار، هل يمكن وضع الكلمات في مجموعة مرتبة واستخدام String.format (في جدك 1.5 أو أحدث) أو MessageFormat.format في جدك 1.4. للأسف الأشكال نمط للمختلفان.

String myPattern = "My %s eats your %s";
// get values from the user here
String result = String.format( myPattern, (Object[])myArray );

أو

String myPattern = "My {0} eats your {1}";
// get values from the user here
String result = MessageFormat.format( myPattern, (Object[])myArray );

وهنا هو البرنامج الكامل الذي يملأ السلسلة مع القيم من سطر الأوامر.

public class Format
{
    public static void main( String[] args )
    {
        String pattern = "My %s eats your %s";
        System.out.println( String.format( pattern, (Object[])args ));
    }
}

وكنت هناك جانبان لسؤالك.

أولا، قد ترغب في تجنب استخدام تسلسالت مباشرة في التعليمات البرمجية. ثم يمكنك استخدام بعض الروتين تنسيق سلسلة من وقت التشغيل. هذا لن تخطي تسلسالت، ولكن نقلها من التعليمات البرمجية لوقت التشغيل.

وثانيا، قد ترغب في القيام تسلسالت أكثر efficently. تلك قصة أخرى. أهم شيء هنا هو preallocate المخزن المؤقت كبيرة بما يكفي لسلسلة متسلسلة، منذ إعادة توزيع ذاكرة غالية جدا. نسخ سلاسل فرعية في السلاسل نتيجة وعادة ما تكون أقل تكلفة وهي شر لا بد منه.

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

String x = "Hi";
String y = x + " there!";

وتنفيذ سلسلة سلسلة بطيء جدا في جاوة، لذلك هو ممارسة أفضل للاستخدام StringBuffer بدلا من ذلك، خاصة إذا كان لديك الكثير من تسلسالت:

StringBuffer myStringBuffer = new StringBuffer();
myStringBuffer.append("Hi");
myStringBuffer.append(" there!");

وشيء من هذا القبيل. أنا لم تحقق هذا الآن في المجمع، ولكن أنا متأكد من أنك يمكن أن الرقم بها نفسك.

وغير متأكدة من جافا ولكن في بعض اللغات الأخرى مثل PHP و جافا سكريبت خلق مجموعة والانضمام جميع عناصرها يمكن أن تكون أسرع.

وجافا سكريبت سبيل المثال:

var str = str1 + str2 + str3 + "str4" + str5 + "str6" + str7;
var str = [str1, str2, str3, "str4", str5, "str6", str7].join("");

وPHP سبيل المثال:

$str = $str1 . $str2 . $str3 . "str4" . $str5 . "str6" . $str7;
$str = implode("", array($str1, $str2, $str3, "str4", $str5, "str6", $str7));

وهذا الأسلوب هو الأفضل إذا كنت ترغب في وضع محدد بين كل سلسلة في هذه الحالة لن تكون فقط أسرع ولكن أكثر إحكاما وقراءتها.

وبواسطة "سلسلة تجنب" أفترض أنك يعني تخصيص مساحة لسلسلة جديدة وتعيين ذلك؟ إذا كنت على صافي ثم ب StringBuilder من شأنه أن يساعد بعض ما أعتقد.

إذا كان لديك سلسلة حاجة إلى تعديله في كثير من الأحيان، وذلك باستخدام شار [] مجموعة وخلق سلسلة عندما يتم تعديله يمكنها أن تفي بالغرض.

وانها بالتأكيد من الممكن القيام بذلك من دون سلسلة إذا كنت ترغب في ذلك. على الرغم من انها ربما لا ثمينة جدا.

وهذا يعتمد جزئيا على أين أنت ذاهب لعرض النتيجة. إذا كان على شبكة الإنترنت أو وحدة التحكم، ثم يمكنك كتابة نتيجة مباشرة لدفق إخراج.

وهكذا على سبيل المثال، إذا كان القالب شيء من هذا القبيل "قفزت٪ 001 من 002٪" يمكنك:

1) مسح السلسلة لمعرفة أين هي المتغيرات. 2) كسر السلسلة في قائمة المكونات "و"، "قفز من"، في هذه الحالة 3) حلقة من خلال العناصر من القائمة الخاصة بك ونتائج ورميها إلى الإخراج مع شيء من هذا القبيل:

PrintStream  = //get output from somewhere
for(int i = 0; i < pieces.size()-1 ; i++){
   ps.print(peices.get(i));
   ps.print(answers.get(i));
}
ps.print(pieces.get(pieces.size()-1));//last one

والآن. أنا لا أعرف إذا كنت ستدعو أن "أنيقة" أم لا. ربما يكون من النوع سريع. كما قلت، ربما يكون مناسبا إذا كان هذا خدمة الويب وأصبح سوبر شعبية، الخ.

إذا هذا هو التطبيق واجهة المستخدم الرسومية، هل يمكن كتابة التعليمات البرمجية لرسم السلاسل بشكل منفصل، ولكن ذلك قد يستغرق المزيد من الوقت ثم سلسلة.

ولكن الشيء الوحيد الذي أنا <> يمكن القيام به هو استخدام ByteArrayOutputStream وقبل تخصيص مساحة كافية بحيث يمكن احتواء مادليب ملء دون مخصصات إضافية. ومن شأن ذلك أن تكون سريعة جدا كذلك.

وماذا كنت ترغب في تجنب سلسلة إذا به للنظافة محاولة بطانة عنه بشكل جيد وأنه قد ينتهي النظر good.Even من المستغرب إذا كنت قلقا حول الأداء الذي قد لا تحتاج إلى استخدام باني سلسلة، وأعتقد أنه إذا كنت تفعل حفنة من تسلسالت ببساطة (أي "fdsfsd" + VAR1 + var2 + "dsfsdf" + "tyhty" أنه يجمع إلى نفس الشيء كما باني سلسلة (على نحو فعال نفسه، وتبدو أكثر نظافة). سلسلة باني لا معنى إذا كنت concating ل طن من الاشياء في حلقة أو مع تدفق معقدة.

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