Как избавиться от места в конце вывода? - PullRequest
0 голосов
/ 29 апреля 2018

Мой код проверяет наличие повторяющихся символов в определенном количестве введенной пользователем строки. Например, если я ввожу строки «google», «paper» и «water», код возвращает «paper» и «water»; потому что "Google" имеет две ОС.

У меня есть часть кода, но при печати после последней строки, которая выводится, появляется пробел, и я не могу понять, как от нее избавиться.

import java.util.Scanner;
import java.util.*;

class words{

    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter the number or words: ");
        String[] words = new String[sc.nextInt()];
        System.out.print("Enter the strings: ");
        boolean truth = false;

        for (int i = 0; i < words.length; i++) {
            words[i] = sc.next();
        }
        for(int i=0;i<words.length;i++){
            int j;
            for(j=1;j<words[i].length();j++) {
                if(words[i].charAt(j) == words[i].charAt(j-1)){
                    break;
                }
            }
            if(j==words[i].length()){
                truth = true;
                System.out.print(words[i]+" ");
            }
        }
        if(!truth){
            System.out.println("NONE");
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Существует легкое решение вашей проблемы. Вместо немедленной печати каждого слова, если оно не имеет непрерывного повторения, добавьте его в переменную String с пробелом в конце, чтобы каждое слово разделялось пробелом. После прохождения цикла вы проверяете, установлен ли ваш флаг на false, и печатаете NONE, если он равен false. Однако, если это правда, выведите строку результата, в которую вы добавили все с помощью .trim () в конце.

for (int i = 0; i < words.length; i++) {
    words[i] = sc.next();
}
String result = ""; /*This is the string that holds all the strings that you need to print.*/

for(int i=0;i<words.length;i++){
    int j;
    for(j=1;j<words[i].length();j++) {
        if(words[i].charAt(j) == words[i].charAt(j-1)){
            break;
        }
    }
    if(j==words[i].length()){
        truth = true;
        result  = result + (words[i]+" ");
    }
}
if(!truth){
    System.out.println("NONE");
}
else{
    System.out.println(result.trim()); /*The trim function removes any redundant space in the beginning and the end of the string.*/
}

Конечно, при таком способе будет потрачено много Кучи памяти, но я думаю, что это для небольшого учебного проекта. Тем не менее, изучите StringBuilder о том, как его использовать, чтобы избежать создания большого объема памяти в куче!

0 голосов
/ 29 апреля 2018

Функции делают логику читабельной

Переместите логику, чтобы проверить наличие повторяющихся символов в функции; Я бы использовал String.toCharArray() и более короткий синтаксис массива. Мол,

private static boolean repeatedChars(String s) {
    if (s == null) {
        return false;
    }
    char[] chars = s.toCharArray();
    for (int i = 0; i < chars.length - 1; i++) {
        if (chars[i] == chars[i + 1]) {
            return true;
        }
    }
    return false;
}

Затем вы можете использовать лямбда-фильтр для фильтрации ваших words, основываясь на том, что они не имеют повторяющихся символов, и собирать с Collectors.joining(CharSequence), как

Scanner sc = new Scanner(System.in);
System.out.print("Enter the number or words: ");
String[] words = new String[sc.nextInt()];
System.out.print("Enter the strings: ");

for (int i = 0; i < words.length; i++) {
    words[i] = sc.next();
}
System.out.println(Arrays.stream(words).filter(s -> !repeatedChars(s))
        .collect(Collectors.joining(" ")));

и , если вам нужно отобразить сообщение NONE, вы можете повторно использовать Predicate<String> как

Predicate<String> pred = s -> !repeatedChars(s);
if (Arrays.stream(words).anyMatch(pred)) {
    System.out.println(Arrays.stream(words).filter(pred).collect(Collectors.joining(" ")));
} else {
    System.out.println("NONE");
}
...