سؤال

بعض زملاء الدراسة و أنا أعمل على وظيفة جافا تتطلب نحن طباعة ArrayList من السلاسل إلى PrintWriter باستخدام كلمة التفاف ، بحيث أن أيا من إخراج يمر 80 حرفا.لقد بحثت على نطاق واسع هذا و لا يمكن العثور على أي API جافا القائمة على طريقة للقيام بذلك.

أنا أعرف انها عموما "الخطأ" إلى طرح سؤال في الواجب على ذلك, ولكن نحن فقط نبحث عن توصيات أفضل طريقة للقيام بذلك ، أو إذا فاتنا شيء في API.هذا ليس الجزء الأكبر من الواجبات صغيرة إخراج الشرط.

من الناحية المثالية, أود أن تكون قادرة على wordwrap ArrayList هو toString لأنه مهيأ بشكل جيد بالفعل.

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

المحلول

حسنًا ، هذا هو الأول بالنسبة لي ، إنها المرة الأولى التي ينشر فيها أحد طلابي سؤالاً حول أحد المشاريع التي قمت بتعيينها لهم. الطريقة التي تم صياغتها ، أنه كان يبحث عن خوارزمية ، والإجابات التي شاركتها جميعًا على ما يرام معي. ومع ذلك ، هذه حالة نموذجية لمحاولة جعل الأمور معقدة للغاية. جزء من المواصفات التي لم يتم ذكرها هو أن حد السعة 80 لم يكن حدًا صعبًا. قلت إن كل سطر من ملف الإخراج يجب أن يبلغ طوله 80 حرفًا تقريبًا. كان من المقبول أن تتجاوز 80 قليلاً. في نسختي من الحل ، كان لديّ عدد من العدد وفعلت معامل العدد لإضافة نهاية الخط. قمت بتغيير قيمة المعامل حتى بدا ملف الإخراج بشكل صحيح. وقد أدى ذلك إلى خطوط بأعداد صغيرة قصيرة حقًا ، لذا استخدمت معاملًا مختلفًا عندما كانت الأرقام صغيرة. لم يكن هذا جزءًا كبيرًا من المشروع ، ومن المثير للاهتمام أن هذا يحظى باهتمام كبير.

نصائح أخرى

كان حلنا هو إنشاء سلسلة مؤقتة وإلحاح عناصر واحدة تلو الأخرى ، تليها فاصلة. قبل إضافة عنصر ما ، تحقق مما إذا كان إضافةه سيجعل السلسلة أطول من 80 حرفًا واختر ما إذا كنت تريد طباعته وإعادة تعيينه أو إلحاقه فقط.

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

أعتقد أن أفضل حل هو إنشاء الخاصة بك WrapTextWriter أن يلتف أي كاتب يتجاوز الأسلوب public void write(String str, int off, int len) throws IOException.ومن هنا يجب تشغيل في حلقة وأداء المنطق من التفاف.

هذا المنطق ليست بسيطة كما str.substring(80).إذا كنت تتعامل مع النص الحقيقي وأتمنى أن التفاف بشكل صحيح (أيلا تقطع الكلمات ، لا تتحرك الغيبوبة أو النقاط إلى السطر التالي إلخ) لديك لتنفيذ بعض المنطق.ربما ليست معقدة جدا ولكن ربما تعتمد اللغة.على سبيل المثال في اللغة الإنجليزية ليس هناك مسافة بين كلمة و القولون بينما في الفرنسية أنها تضع مسافة بينهما.

لذا يقوم الثانية 5 غوغلينغ وجدت ما يلي المناقشة التي يمكن أن تساعدك.

private static final int MAX_CHARACTERS = 80;

public static void main(String[] args) 
    throws FileNotFoundException 
{
    List<String> strings = new ArrayList<String>();

    int size = 0;

    PrintWriter writer = new PrintWriter(System.out, true); // Just as example

    for (String str : strings)
    {
        size += str.length();

        if (size > MAX_CHARACTERS)
        {
            writer.print(System.getProperty("line.separator") + str);
            size = 0;
        }
        else
            writer.print(str);
    }

}

يمكنك ببساطة كتابة وظيفة ، مثل "void printWordWrap(List<String> strings)"، مع تلك الخوارزمية في الداخل. أعتقد ، إنها طريقة جيدة لحل مشكلتك. :)

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