gpt4 book ai didi

java - For 循环替换 : For Loops to Filters

转载 作者:行者123 更新时间:2023-11-29 05:15:46 24 4
gpt4 key购买 nike

我正在完成计算机科学 III 类(class)(Java 编程)的作业,其中我们必须根据霍夫曼编码对文件进行编码。

import java.util.Scanner;
import java.util.ArrayList;
import java.io.*;
import java.util.Collections;
import java.util.StringTokenizer;

public class Client {

public static void main(String[] args) throws IOException {
// TODO code application logic here
Scanner in = new Scanner(System.in);
System.out.println("Enter a filename to read from.");
String filename = in.nextLine();
File file = new File(filename);
Scanner inputFile = new Scanner(file);
String line, word;
StringTokenizer token;
ArrayList<Character> chars = new ArrayList<>();
while(inputFile.hasNext()){
line = inputFile.nextLine();
ArrayList<Character> lineChar = new ArrayList<>();
for (int i=0; i<line.length(); i++){
if (line.charAt(i)!=' '){
lineChar.add(line.charAt(i));
}
}
chars.addAll(lineChar);
}

ArrayList<Character> prob = new ArrayList<Character>();
for (int i=0; i<chars.size(); i++){
if (!prob.contains(chars.get(i))){
prob.add(chars.get(i));
}
}
for (int i=0; i<prob.size(); i++){
System.out.print("Frequency of " + prob.get(i));
System.out.println(": " + ((double)Collections.frequency(chars, prob.get(i)))/chars.size());
}

我在我的 NetBeans IDE 中处理它并遵循了一些建议。它将最后两个 for 循环更改为:

    chars.stream().filter((char1) -> (!prob.contains(char1))).forEach((char1) -> {
prob.add(char1);
});

prob.stream().map((prob1) -> {
System.out.print("Frequency of " + prob1);
return prob1;
}).forEach((prob1) -> {
System.out.println(": " + ((double) Collections.frequency(chars, prob1)) / chars.size());
});

我真的、真的、真的对此很感兴趣,但我发现很难追踪一切。它显然以与我的 for 循环相同的方式运行,并且在测试之后我发现它 - 确实 - 有效,但我想了解为什么以及如何。任何人都可以给我任何见解吗?

最佳答案

您的 IDE 用新的 Java 8 功能 - 流和 lambda 表达式替换了一些代码。你应该阅读它们。

Streams 允许您对管道中的集合执行操作,其中只有最终(终端)操作对元素进行实际迭代(仅对所需数量的元素进行迭代)。

Lambda 表达式允许您在将实现功能接口(interface)(=具有单个方法的接口(interface))的匿名类实例传递给方法时编写更少的代码。

这里尝试解释新代码的作用:

chars.stream() // creates a Stream<Character> from your chars List
.filter((char1) -> (!prob.contains(char1))) // keeps only Characters not contained
// in prob List
.forEach((char1) -> {prob.add(char1);}); // iterates over all the elements of
// the Stream (i.e. those that weren't
// filtered out) and adds them to prob

prob.stream() // creates a Stream<Character> of the prob List
.map((prob1) -> {
System.out.print("Frequency of " + prob1);
return prob1;
}) // prints "Frequency of " + character for the current Character in the Stream
.forEach((prob1) -> { // prints the frequency of each character in the Stream
System.out.println(": " + ((double) Collections.frequency(chars, prob1)) / chars.size());
});

第二个Stream的map操作有点奇怪。通常 map 用于将一种类型的 Stream 转换为另一种类型的 Stream。这里它用于打印输出并返回相同的 Stream。我不会为此使用 map。您可以简单地将打印移动到 forEach

prob.stream() // creates a Stream<Character> of the prob List
.forEach((prob1) -> { // prints the frequency of each character in the Stream
System.out.print("Frequency of " + prob1);
System.out.println(": " + ((double) Collections.frequency(chars, prob1)) / chars.size());
});

实际上,您不需要为此使用 Stream,因为 Collections 在 Java 8 中也有一个 forEach 方法:

prob.forEach((prob1) -> { // prints the frequency of each character in the Stream
System.out.print("Frequency of " + prob1);
System.out.println(": " + ((double) Collections.frequency(chars, prob1)) / chars.size());
});

关于java - For 循环替换 : For Loops to Filters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26610228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com