【问题标题】:How to get rid of space at the end of output?如何在输出结束时摆脱空间?
【发布时间】:2018-04-28 23:39:22
【问题描述】:

我的代码检查一定数量的用户输入的字符串是否有任何重复的字符。例如,如果我输入字符串“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");
        }
    }
}

【问题讨论】:

    标签: java arrays syntax output


    【解决方案1】:

    函数使逻辑可读

    将检查重复字符的逻辑移动到函数中;我会利用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;
    }
    

    然后,您可以使用 lambda 过滤您的 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&lt;String&gt; 喜欢

    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");
    }
    

    【讨论】:

      【解决方案2】:

      有一个简单的解决方法可以解决您的问题。如果没有任何连续重复,则不要立即打印每个单词,而是将其添加到末尾带有空格的 String 变量中,以便每个单词用空格分隔。运行完循环后,检查标志是否为假,如果为假则打印 NONE。但是,如果它是真的,则打印结果字符串,您在其中添加了最后带有 .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 以了解如何使用它来避免在堆中创建大量内存!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2015-02-13
        相关资源
        最近更新 更多