【问题标题】:Grouping array elements of same value in each line while printing - Java [closed]打印时在每行中对具有相同值的数组元素进行分组-Java [关闭]
【发布时间】:2021-12-04 23:51:28
【问题描述】:

有一种方法可以打印按每行字长排序的字符串数组的元素吗? 所以,考虑到下面的代码,

String[] arr = {"a", "b", "cc", "dd", "ee", "fff", "hhh"};
            
    for (int i = 0; i < 5; i++) {
        System.out.println(arr[i]);
    }

有一种方法可以改变输出:

"a b cc dd ee fff hhh"

"a b

cc dd ee

fffhhh"

感谢您的帮助。

【问题讨论】:

  • 请记住,StackOverflow 不是一个用于家庭作业的网站,它看起来像一个。请描述您尝试的步骤以及您遇到的具体问题,谢谢。
  • 1.元素不是相同的值,它们具有相同的长度 2。元素当前按长度排序。输入数组是否总是以这种方式排序?混合元素时输出应该如何?

标签: java arrays sorting string-length


【解决方案1】:

我会使用 stream 来完成这项工作:

Arrays.stream(arr).collect(
            Collectors.groupingBy(String::length, 
                    Collectors.joining(" ")))
      .values().forEach(System.out::println);
    

输出:

a b
cc dd ee
fff hhh

【讨论】:

  • 我相信对于一个不知道如何对相同长度的字符串进行分组的人来说,流是很难理解的。但仍然很棒的代码。
  • 我同意,IMO 在进入 streams 之前,您应该对 loops 感到满意
  • 非常感谢 Oboe ant 对每个人的帮助。实际上我是一个初学者(正如你可能从我的帖子中完全理解的那样),我认为使用经典的 for 循环解决问题是可能的。我已经开始尝试了解流的工作原理,因此,首先,感谢您给我机会学习新知识。
  • 我很高兴它有帮助 ;)
【解决方案2】:

在剧透之前,先给大家一些提示:

  1. 创建一个变量来存储前一个字符串的长度。 (设置为 Integer.MAX_Value 开始)
  2. 遍历数组。如果 previousLength 小于 currentString 的长度,则插入换行符。
  3. 打印当前字符串,末尾有一个空格。
  4. 将1中的变量设置为当前字符串的长度
  5. 循环结束

请尝试自己编写代码,因为这有助于您更好地理解 Java。

【讨论】:

  • 您不需要临时变量。只需检查当前长度和先前长度是否不同即可打印新行。在所有情况下,您总是打印该值。一个问题是第一项会导致 ArrayIndexOutOfBoundsException,所以你有两种方法来解决它: 1. 如果(索引 > 0 并且当前长度和前一个长度不同)然后打印新行。 2. 先打印第一项,然后循环从index = 1开始
  • 您应该始终尝试使用 forEach 循环。那件事让你的生活更轻松。您不需要检查索引并且可以安全地遍历数组。在这种情况下,您需要一个整数(4 字节长度)。我认为多 4 字节的内存不会对您的应用程序速度产生很大影响,但会使您的应用程序更加健壮。
  • 说实话,我喜欢 Java 8、11 和任何其他版本,但我不想对那些不太了解 Java 新版本的人使用奇怪的语法。而且我认为在 forEach 中使用非(有效)最终变量是不可能的。
【解决方案3】:

所以这是我对这个问题的看法。它不涉及使用索引并避免使用流,因为这不是初学者应该开始的。

   public static void main(String[] args) {
        String[] arr = {"a", "b", "cc", "dd", "ee", "fff", "hhh"};
        int previousLength = Integer.MAX_VALUE;
    
        for (String currentString: arr){
            if(previousLength < currentString.length()){
                System.out.println("");
            }
            System.out.print(currentString+" ");
            previousLength = currentString.length();
        }
    }

【讨论】:

  • 此代码不起作用,因为它假定 arr 已经按长度排序。
  • 嗨@SamTV,非常感谢您对我的问题的贡献,作为初学者,它更容易理解。我有一个问题:您能解释一下您选择将 previousLength 的值设置为 Integer.MAX_VALUE 的具体原因吗?我之所以问是因为我试图将其设置为 0 并且代码似乎无论如何都可以正常工作。再次非常感谢。
  • 嗨@gianni85 很高兴能帮到你。我使用 Integer.MaxValue ,在任何情况下都不会在开头打印换行符(previousLength
  • Nik Vinter 请仔细阅读作业。这只是关于正确格式化输入。不需要对数组进行排序。
  • @SamTV "print elements of a String array sorted for word length at each line" 假设给定任何 String 数组,输出应该是按字长排序的内容
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多