我想知道 system.out.println() 在这段代码中做了什么

要反转映射,使其不同的值成为键,并将其键添加到相应值下的集合中,请groupingBy()在映射条目上使用。原始映射中的值必须正确实现equals()并hashCode()用作新哈希表中的键,这一点很重要。


static <K, V> Map<V, Set<K>> invert(Map<? extends K, ? extends V> original) {

  return original.entrySet().stream()

    .collect(Collectors.groupingBy(

      Map.Entry::getValue, 

      Collectors.mapping(Map.Entry::getKey, Collectors.toSet())

    ));

}

如果你想对组进行排序,你可以创建一个专门的“下游”收集器:


static <K, V> Map<V, SortedSet<K>> invert(

    Map<? extends K, ? extends V> original, 

    Comparator<? super K> order) {


  Collector<K, ?, SortedSet<K>> toSortedSet = 

     Collectors.toCollection(() -> new TreeSet<>(order));

  return original.entrySet().stream()

    .collect(Collectors.groupingBy(

      Map.Entry::getValue, 

      Collectors.mapping(Map.Entry::getKey, toSortedSet)

    ));

}


慕标琳琳
浏览 78回答 3
3回答

largeQ

首先,让我们看一下代码的输出:.****..***...**....*.....作为字符串,这与:.****\n..***\n...**\n....*\n.....\n默认情况下,在 Java 中使用System.out会写入标准字符输出流。当您写入此流时,可以使用各种方法,包括System.out.print和System.out.println。调用print将输出您提供给它的确切字符串,而调用println将输出您提供给它的字符串,后跟一个新行(系统的行分隔符)。如果您调用System.out.println()(println不带参数),您将输出您提供的字符串("")并将输出移动到下一行。本质上,这意味着删除System.out.println()代码中的调用将产生以下输出:.****..***...**....*.....此输出看起来与字符串完全相同。\n正如您所看到的,当您只调用System.out.print和不调用时,输出中没有换行符 ( ) System.out.println。最后,让我们看看您的代码,使其更易于阅读和理解。我正在使用 Java 11+ 功能String.repeat来极大地简化此处重复字符串的操作:public static void main(String[] args) {&nbsp; for (int i = 1; i <= 5; i++) {&nbsp; &nbsp; System.out.println(".".repeat(i)+"*".repeat(5-i));&nbsp; }}输出:.****..***...**....*.....这相当于原始输出。然而,阅读和理解正在发生的事情会更清楚。假设您无权访问这些功能,您可以执行以下操作:for (int i = 1; i <= 5; i++) {&nbsp; for(int rpts = 0; rpts < i; rpts++) {&nbsp; &nbsp; System.out.print('.');&nbsp; }&nbsp; for(int rpts = i; rpts < 5; rpts++) {&nbsp; &nbsp; System.out.print('*');&nbsp; }&nbsp; System.out.println();}这段代码也有相同的输出。它的内容与您的代码片段没有太大区别,因为您的代码片段确实有正确的想法。然而,它的格式更加一致,这使得您自己和其他人更容易阅读代码。请注意重复如何用 name 进行标记rpts,并且(在两个示例中)迭代变量都是整数。Java 程序员通常使用整数进行迭代,因为使用迭代所节省的空间bytes对于大多数应用程序而言可以忽略不计,并且整数涵盖了您可能想要迭代的大多数值范围。

12345678_0001

您的代码的输出是:.****..***...**....*.....如果没有System.out.println();,输出将是:.****..***...**....*.....System.out.println();对于循环的每次交互,都会在屏幕上打印一个新行字符。

catspeake

欢迎来到堆栈溢出!a 本身System.out.println()只会打印一个换行符,例如\n。如果您要向此语句添加参数,它将打印您的参数以及换行符。这是 JavaDocsprintln通过写入行分隔符字符串来终止当前行。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个换行符 ('\n')。您链接的代码将打印一定数量的.字符和一定数量的*字符,没有任何换行符。然后,最后一个System.out.println();将打印一个换行符,并且循环将重新开始。输出:.**** ..*** ...** ....* .....
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java