循环中赋值的静态String无法保留完整上下文问题求助
问题分析与解决办法
嘿,我来帮你捋清楚这个问题!其实原因特别直观,你现在的代码里每次循环都在覆盖info变量的值,而不是把新内容追加进去,这就是最后只显示一行的核心问题。
问题到底出在哪?
你看循环里的这行代码:
info = tempinfo;
每次循环执行到这里,都会把当前的tempinfo直接赋值给info——就像每次拿一张新的纸完全盖住旧纸,最后自然只剩最后那张纸的内容。而循环里的System.out.println(tempinfo)能打印5行,是因为它每次都会输出当前循环生成的tempinfo,和info的赋值操作完全是两回事。
怎么解决?
我们需要把每次生成的tempinfo内容追加到info里,而不是替换掉它。这里有两种实用的方法:
方法1:字符串直接拼接(适合新手快速上手)
先把info的初始值设为空字符串(默认是null,直接拼接会出问题),然后在循环里用+=来追加内容,记得加上换行符保证输出格式和循环内一致:
// 把静态变量初始化改为空字符串 static String info = ""; // 循环里的赋值改成追加操作 info += tempinfo + "\n";
方法2:使用StringBuilder(更高效,推荐长期使用)
如果以后要处理大量字符串拼接,StringBuilder比直接用+=效率高很多,修改方式如下:
// 把静态变量换成StringBuilder并初始化 static StringBuilder info = new StringBuilder(); // 循环里改成append方法追加内容 info.append(tempinfo).append("\n"); // printinfo方法里要把StringBuilder转换成String输出 public void printinfo() { System.out.println(info.toString()); }
修改后的完整代码示例(StringBuilder版本)
import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class dothework { static StringBuilder info = new StringBuilder(); // 替换为StringBuilder并初始化 public void scrapeinfo() throws IOException { Document doc = Jsoup.connect("html").get(); Elements el_name = doc.select(".champ-name"); Elements el_speed = doc.select(".speed"); Elements el_altitude = doc.select(".altitude"); for(int i = 0; i < 5; i++) { String name = el_name.get(i).text(); String speed = el_speed.get(i).text(); String altitude = el_altitude.get(i).text(); String tempinfo = (name+": "+speed+" ("+altitude+")"); System.out.println(tempinfo); info.append(tempinfo).append("\n"); // 追加内容而非覆盖 } } public void printinfo() { System.out.println(info.toString()); // 转换为String输出 } }
这样修改后,调用printinfo()就能输出完整的5行内容啦!
内容的提问来源于stack exchange,提问作者John Dhoe
相关产品推荐
相关产品推荐

