كيف يمكنك مضاعفة كل حرف في سلسلة باستخدام حلقة for و if if statement في java

أحتاج إلى مضاعفة كل حرف في سلسلة باستخدام حلقة for وعبارة if-then. كيف يمكنك التمرير عبر سلسلة واختبار ما إذا كان كل حرف حرفًا أو رمزًا مثل علامة تعجب؟ ثم قم بطباعة السلسلة مرة أخرى مع مضاعفة كل حرف وكل نقطة تعجب ثلاث مرات.

هذا ما لدي حتى الآن. إنها غير منتهية ولا تعمل على الإطلاق ، ولكن هل أنا على الطريق الصحيح؟

import java.util.Scanner;

public class DoubleLetters{
  public static void main(String[] args){
  Scanner scan = new Scanner(System.in);

  System.out.println("Enter a sentence:");
  String sentence = scan.nextLine();

  boolean isLetter = false;

  for (int i = 0; i < sentence.length(); i++){
    isLetter = Character.isLetter(sentence.charAt(i));
    if (i == sentence.length() || sentence.charAt(i) == ' ' || isLetter == false){
    System.out.print(sentence.charAt(i) + sentence.charAt(i));
  }
}
0
ما تحتاج إلى القيام به هو التعليق على ما تفعله. إذا كان بإمكانك أن تشرح لشخص ما باللغة الإنجليزية ما الذي يحدث للمحلل في كل خطوة واحدة ، فيمكنك الحصول عليه للعمل بنفسك. وهنا نصيحتان. 1) استخدام "الكلمات" بدلاً من السطر بالكامل سيساعدك على التفكير في الأمر بشكل أفضل. 2) تأكد من طباعة شيء ما عند كل تكرار (مرة أو مرتين) ، مما يساعدك في تصحيح الأخطاء.
وأضاف المؤلف ergonaut, مصدر
ما تحتاج إلى القيام به هو التعليق على ما تفعله. إذا كان بإمكانك أن تشرح لشخص ما باللغة الإنجليزية ما الذي يحدث للمحلل في كل خطوة واحدة ، فيمكنك الحصول عليه للعمل بنفسك. وهنا نصيحتان. 1) استخدام "الكلمات" بدلاً من السطر بالكامل سيساعدك على التفكير في الأمر بشكل أفضل. 2) تأكد من طباعة شيء ما عند كل تكرار (مرة أو مرتين) ، مما يساعدك في تصحيح الأخطاء.
وأضاف المؤلف ergonaut, مصدر
كيف تتوقع i == sentence.length() أن تصبح true ؟ أيضًا char + char ! = String
وأضاف المؤلف fabian, مصدر
كيف تتوقع i == sentence.length() أن تصبح true ؟ أيضًا char + char ! = String
وأضاف المؤلف fabian, مصدر
لا أفهم لماذا كان تعليق StringBuilder أكثر من ذلك بكثير. StringBuilder عبارة عن تحسين على String تسلسل ، لا يوجد منها أي منها.
وأضاف المؤلف Aaron, مصدر
لا أفهم لماذا كان تعليق StringBuilder أكثر من ذلك بكثير. StringBuilder عبارة عن تحسين على String تسلسل ، لا يوجد منها أي منها.
وأضاف المؤلف Aaron, مصدر
اشرح (في تعديل لسؤالك) ما تخيلت الشرط i == sentence.length() || sentence.charAt (i) == '' || isLetter == false للقيام به ، وسأجيب على سؤالك.
وأضاف المؤلف Mad Physicist, مصدر
اشرح (في تعديل لسؤالك) ما تخيلت الشرط i == sentence.length() || sentence.charAt (i) == '' || isLetter == false للقيام به ، وسأجيب على سؤالك.
وأضاف المؤلف Mad Physicist, مصدر
سأفكر في استخدام StringBuilder
وأضاف المؤلف 3kings, مصدر
كان لدي البيان إذا وضعت بشكل مختلف في البداية. لقد وجدت ما هناك الآن على سؤال آخر وكان مجرد تجربة مع ما فعلته.
وأضاف المؤلف Typag4, مصدر
كان لدي البيان إذا وضعت بشكل مختلف في البداية. لقد وجدت ما هناك الآن على سؤال آخر وكان مجرد تجربة مع ما فعلته.
وأضاف المؤلف Typag4, مصدر

6 إجابة

يبدو أنك كنت على الطريق الصحيح ، ثم مرت على الخروج الصحيح وحملت بطريقة خاطئة.

for (int i = 0; i < sentence.length(); i++){ [...] } is a right way to iterate over a string's characters.

Character.isLetter(c) is a right way to check whether a character is a letter.

ومع ذلك ، فإن حالتك تكون فوضوية:

  • لماذا تضع شروطًا خاصة للمسافات وشخصيات النهاية؟
  • لماذا تم إلغاء شرط isLetter الخاص بك؟

أعتقد أن حالتك يجب أن تكون ببساطة

if (isLetter) { /* print twice */ } 
else if (isExclamationPoint) { /* print "thrice" */ }
else { /* print once */ }
1
وأضاف
شكرا ، لم تلاحظ ذلك. تعديل قيد التقدم.
وأضاف المؤلف Aaron, مصدر
يجب أن تتضاعف نقطة التعجب ثلاث مرات ، لذا فهذه حالة خاصة تحتاج إلى التعامل معها
وأضاف المؤلف Idos, مصدر

يبدو أنك كنت على الطريق الصحيح ، ثم مرت على الخروج الصحيح وحملت بطريقة خاطئة.

for (int i = 0; i < sentence.length(); i++){ [...] } is a right way to iterate over a string's characters.

Character.isLetter(c) is a right way to check whether a character is a letter.

ومع ذلك ، فإن حالتك تكون فوضوية:

  • لماذا تضع شروطًا خاصة للمسافات وشخصيات النهاية؟
  • لماذا تم إلغاء شرط isLetter الخاص بك؟

أعتقد أن حالتك يجب أن تكون ببساطة

if (isLetter) { /* print twice */ } 
else if (isExclamationPoint) { /* print "thrice" */ }
else { /* print once */ }
1
وأضاف
شكرا ، لم تلاحظ ذلك. تعديل قيد التقدم.
وأضاف المؤلف Aaron, مصدر
يجب أن تتضاعف نقطة التعجب ثلاث مرات ، لذا فهذه حالة خاصة تحتاج إلى التعامل معها
وأضاف المؤلف Idos, مصدر

جرب هذا:

    import java.util.*;

    public class DoubleLetters{
      public static void main(String[] args){
          Scanner scan = new Scanner(System.in);

          System.out.println("Enter a sentence:");
          String sentence = scan.nextLine();

          StringBuilder sb = new StringBuilder();
          for (Character c: sentence.toCharArray()){
            sb.append(c);

            if(Character.isLetter(c)){
                sb.append(c);
            }
            else if(c == '!'){
                sb.append(c).append(c);
            }
          }
          sentence = sb.toString();
          System.out.println(sentence);
      }
    }
0
وأضاف
عظيم. إذا كانت الإجابة صالحة لك ، فالرجاء وضع علامة عليها باعتبارها الإجابة الصحيحة و/أو الإشارة إليها.
وأضاف المؤلف pczeus, مصدر
يا هذا يعمل! شكرا جزيلا. لست مألوفة على الإطلاق مع فئة stringBuilder أو صفائف ، لذا لم أحاول استخدامها ، ولكن هذا يبدو وكأنه أبسط طريقة للقيام بذلك.
وأضاف المؤلف Typag4, مصدر

جرب هذا:

    import java.util.*;

    public class DoubleLetters{
      public static void main(String[] args){
          Scanner scan = new Scanner(System.in);

          System.out.println("Enter a sentence:");
          String sentence = scan.nextLine();

          StringBuilder sb = new StringBuilder();
          for (Character c: sentence.toCharArray()){
            sb.append(c);

            if(Character.isLetter(c)){
                sb.append(c);
            }
            else if(c == '!'){
                sb.append(c).append(c);
            }
          }
          sentence = sb.toString();
          System.out.println(sentence);
      }
    }
0
وأضاف
عظيم. إذا كانت الإجابة صالحة لك ، فالرجاء وضع علامة عليها باعتبارها الإجابة الصحيحة و/أو الإشارة إليها.
وأضاف المؤلف pczeus, مصدر
يا هذا يعمل! شكرا جزيلا. لست مألوفة على الإطلاق مع فئة stringBuilder أو صفائف ، لذا لم أحاول استخدامها ، ولكن هذا يبدو وكأنه أبسط طريقة للقيام بذلك.
وأضاف المؤلف Typag4, مصدر

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

كما أوصي بمواصلة الاتصال String.charAt لتحقيق أقصى قدر من الكفاءة.

قد ترغب أيضًا في تغليف روتينك في إحدى الوظائف. يمكنك أخذ الإدخال كـ CharSequence للحصول على أقصى فائدة.

public class DoubleLetters {
    private static int getRepetitionCount(char c) {
        if (Character.isLetter(c)) {
            return 2;
        } else if (c == '!') {
            return 3;
        } else {
            return 1;
        }
    }

    public static String doubleLetters(CharSequence in) {
        int inLength = in.length();
        int outLength = 0;

        for (int i = 0; i < inLength; ++i) {
            outLength += getRepetitionCount(in.charAt(i));
        }

        StringBuilder out = new StringBuilder(outLength);

        for (int i = 0; i < inLength; ++i) {
            char c = in.charAt(i);
            int reps = getRepetitionCount(c);

            for (int r = 0; r < reps; ++r) {
                out.append(c);
            }
        }

        return out.toString();
    }

    public static void main(String[] args) {
        String test = "hello! world!";
        System.out.print(doubleLetters(test));
    }
}

في هذه الحالة المحددة ، يمكنك بدلاً من ذلك تخصيص مخزن مؤقت بالحجم 3 * inLength ، والذي سيكون كبيرًا بما يكفي لاستيعاب أي سلسلة خرج محتملة.

0
وأضاف

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

كما أوصي بمواصلة الاتصال String.charAt لتحقيق أقصى قدر من الكفاءة.

قد ترغب أيضًا في تغليف روتينك في إحدى الوظائف. يمكنك أخذ الإدخال كـ CharSequence للحصول على أقصى فائدة.

public class DoubleLetters {
    private static int getRepetitionCount(char c) {
        if (Character.isLetter(c)) {
            return 2;
        } else if (c == '!') {
            return 3;
        } else {
            return 1;
        }
    }

    public static String doubleLetters(CharSequence in) {
        int inLength = in.length();
        int outLength = 0;

        for (int i = 0; i < inLength; ++i) {
            outLength += getRepetitionCount(in.charAt(i));
        }

        StringBuilder out = new StringBuilder(outLength);

        for (int i = 0; i < inLength; ++i) {
            char c = in.charAt(i);
            int reps = getRepetitionCount(c);

            for (int r = 0; r < reps; ++r) {
                out.append(c);
            }
        }

        return out.toString();
    }

    public static void main(String[] args) {
        String test = "hello! world!";
        System.out.print(doubleLetters(test));
    }
}

في هذه الحالة المحددة ، يمكنك بدلاً من ذلك تخصيص مخزن مؤقت بالحجم 3 * inLength ، والذي سيكون كبيرًا بما يكفي لاستيعاب أي سلسلة خرج محتملة.

0
وأضاف