Как отобразить запятую, если переменные результаты больше двух и «и» в конце результата? - PullRequest
3 голосов
/ 25 сентября 2019

Код, который дает кратные 5 в данном числе пользователем (x, y).Если ничего не отображается, выведите «NONE».Если есть два для отображения, разделите его с "и".И если есть два или более для отображения, разделите его запятой и «и» в конце.

System.out.print("Enter first number: ");
int x = new Scanner (System.in).nextInt();
System.out.print("Enter last number: ");
int y = new Scanner (System.in).nextInt();
System.out.print("The multiples of 5 from "+x+ " to " +y+ " : ");

for (;x<=y; x++) {  
    if(x%5==0) {
            System.out.printf("%,d ",x);
    }
}

Пример вывода:

Enter number: 1
Enter number: 4
The multiples of 5 from 1 to 4: NONE

Пример вывода:

Enter number: 8
Enter number: 12
The multiples of 5 from 8 to 12: 10

Пример вывода:

Enter number: 1
Enter number: 17
The multiples of 5 from 1 to 17: 5, 10, and 15.

Ответы [ 6 ]

2 голосов
/ 25 сентября 2019

Запятая, которую вы используете в printf, не простой символ, это часть шаблона %,d.

Формат строки синтаксиса

  • Если задан флаг ',' ('\u002c'), то вставляется разделитель группировки, зависящий от локали, путем сканирования целой части строки от наименее значимых до наиболее значимых цифр и вставки разделителя через определенные интервалыпо размеру группировки локали.

Вам необходимо переместить его из шаблона %d и добавить условие для удаления запятой для первого соответствующего номера.

for (int i = 0; x <= y; x++) {
    if (x % 5 == 0) {
        System.out.printf("%s%d", (i++ == 0 ? "" : ","), x);
    }
}

Или вы можете написать это необычно

String result = IntStream.rangeClosed(x, y)
                         .filter(i -> i % 5 == 0)
                         .mapToObj(Integer::toString)
                         .collect(Collectors.joining(","));
System.out.println(result);

Я показал два рабочих примера, которые используют "," в качестве единственного разделителя.Это становится немного сложнее для трех разделителей ("," и ", and" и " and ").Это редкий случай, когда пригодится оператор switch.

final List<String> values = IntStream.rangeClosed(x, y)
        .filter(i -> i % 5 == 0)
        .mapToObj(Integer::toString)
        .collect(Collectors.toList());

switch (values.size()) {
    case 0:
        System.out.println("NONE");
        break;
    case 1:
        System.out.println(values.get(0));
        break;
    case 2:
        System.out.println(String.join(" and ", values));
        break;
    default:
        final String last = values.remove(values.size() - 1);
        System.out.println(String.join(", ", values) + ", and " + last);
}
1 голос
/ 25 сентября 2019

Попробуйте, Создайте условную базу, заканчивающуюся символом.

     System.out.print("Enter first number: ");
            int x = new Scanner(System.in).nextInt();
            System.out.print("Enter last number: ");
            int y = new Scanner (System.in).nextInt();
            System.out.print("The multiples of 5 from "+x+ " to " +y+ " : ");
            if ((x<5 && y<5) || y/5 == x/5) {
                System.out.printf("NONE");
            }
            else {
                while (y > x) {
                    if (x%5==0) {
                        System.out.printf("%d", x);
                        x += 5;
                        if (x < y) {
                            if (x + 5 < y) {
                                System.out.printf(" , ");
                            } else {
                                System.out.printf(" and ");
                            }
                        }
                    } else {
                        x += 1;
                    }
                }
            }
1 голос
/ 25 сентября 2019

РЕДАКТИРОВАТЬ: я отредактировал свой ответ, чтобы соответствовать всем размерам результатов-ArrayList:

class Main {

    public static void main(String[] args) {
        System.out.print("Enter first number: ");
        int x = new Scanner(System.in).nextInt();
        System.out.print("Enter last number: ");
        int y = new Scanner(System.in).nextInt();
        System.out.print("The multiples of 5 from " + x + " to " + y + " : ");
        ArrayList<Integer> results = new ArrayList<Integer>();
        for (; x <= y; x++) {
            if (x % 5 == 0) {
                results.add(new Integer(x));
            }
        }
        if (results.size() == 0) {
            System.out.println("No results to display.");
        } else if (results.size() == 1) {
            System.out.println(results.get(0));
        }  else {
            for (int i = 0; i < results.size() - 2; i++) {
                System.out.print(results.get(i) + ", ");
            }
            System.out.print(results.get(results.size() - 2));
            System.out.println(" and " + results.get(results.size() - 1));
        }
    }
}

Используя ArrayList, вы можете сохранить значения и затем распечатать их.Цикл for печатает только все элементы, но без последнего, который затем печатается с «и» перед ним!Я надеюсь, вы понимаете, как это работает.

0 голосов
/ 25 сентября 2019

Позвольте мне начать с нескольких советов вашего текущего кода.В настоящее время вы создаете два Scanners для обоих ваших пользовательских входов.Было бы лучше всего создать его и использовать повторно.Так что измените:

System.out.print("Enter first number: ");
int x = new Scanner (System.in).nextInt();
System.out.print("Enter last number: ");
int y = new Scanner (System.in).nextInt();
System.out.print("The multiples of 5 from "+x+ " to " +y+ " : ");

На:

Scanner scanner = new Scanner (System.in);
System.out.print("Enter first number: ");
int x = scanner.nextInt();
System.out.print("Enter last number: ");
int y = scanner.nextInt();
System.out.print("The multiples of 5 from "+x+ " to " +y+ " : ");

Далее я бы посоветовал сделать шаг в переменную, чтобы потом было легче его изменить (или, возможно, спросить у пользователяв качестве входных данных):

int step = 5;
...
System.out.print("The multiples of "+step+" from "+x+ " to " +y+ " : ");
...
   if(x%step == 0){
      ...

А теперь о вашей актуальной проблеме.Давайте сначала проанализируем, что вы хотите:

  • Вы хотите, чтобы разделитель для большинства элементов был ", " (базовый случай)
  • Вы хотите, чтобы разделитель для второго целого числа витерация должна быть " and "
  • И последнее целое число больше не нуждается в разделителе, поскольку это конечный элемент

Давайте теперь преобразуем эти требования в код:

for(; x<=y; x++){  
    if(x%step == 0){

       // The last `x` that will be printed, is the x where the difference between y and x
       // is smaller than the step-size:
       boolean lastNumber = y-x < step;
       // The `x` for which we want an " and " separator is the second to last item,
       // so the difference between x and y should be smaller than twice the step-size:
       boolean showAnd = y-x < 2*step;
       // And then we can use these two booleans with a simple ternary-if to determine the
       // format we'd want to use in our print:
       System.out.printf(lastNumber ? "%d\n"
                          : showAnd ? "%d and "
                          :           "%d, ",
                         x);
  }
}

Попробуйте онлайн.

0 голосов
/ 25 сентября 2019

Это мое решение для этого:

Scanner scan = new Scanner(System.in);
        System.out.print("Enter first number: ");
        int x = scan.nextInt();
        System.out.print("Enter last number: ");
        int y = scan.nextInt();
        String output = "The multiples of 5 from " + x + " to " + y + " : ";
        for (; x <= y; x++) {
            if (x % 5 == 0) {
                output = output + x + ", ";
            }
        }
        output = output.substring(0,output.length() -5) + " and "+output.substring(output.length() -4, output.length()-2); 
        System.out.println(output);
0 голосов
/ 25 сентября 2019

рассмотрим API потока, как

IntStream.range(2, 8).mapToObj(Integer::toString).collect(Collectors.joining(", and "))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...