- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下说明来自问题 4:“Justifying Text”,来自 Programming Olympiad 2012: Round 1 :
Write a program that will take the provided text and print it out in a column of a specified width (just like in a newspaper). Words at the end of a line that would end beyond the length specified, must be moved to the next line. Spaces must be added between the words so that each line is exactly the specified width and the spaces are as evenly distributed over the line as possible. If only one word fits in a line, that word must be left-aligned. The width of a column will always be greater than or equal to nine. Use the following text: “A great discovery solves a great problem but there is a grain of discovery in the solution of any problem”
我使用的方法是将要使用的位数设置为宽度集,例如。宽度 20 = 20 位数字。每个数字都可以用文本中的字母或空格填充。这种方法效果不是很好,因为有些字母的长度比其他字母的长度要宽。
你认为我的方法可以吗?如何使用不同的算法产生更好的结果?我该如何改进下面的代码?
这是我的解决方案:
public class main {
public static void main(String[] args) {
String text = "A great discovery solves a great problem but there is a grain of discovery in the solution of any problem";
int input = Integer.valueOf(JOptionPane.showInputDialog("Input: "));
String[] words = text.split(" ");
int amDigits = 0;
ArrayList<String> wordsOfLine = new ArrayList<String>();
String line = "";
for(int i = 0; i < words.length; i++) {
if(amDigits < input) {
amDigits += words[i].length() + 1;
wordsOfLine.add(words[i]);
}
else {
// System.out.println("Words: " + wordsOfLine);
int totalWhiteSpace = 0;
for(int a = 0; a < wordsOfLine.size(); a++) {
totalWhiteSpace = input - wordsOfLine.get(a).length();
}
int singleWhiteSpace = Math.round((float) totalWhiteSpace/(float) wordsOfLine.size() - 1);
System.out.println(singleWhiteSpace);
for(int b = 0; b < wordsOfLine.size(); b++) {
line += wordsOfLine.get(b);
for(int c = 0; c < singleWhiteSpace; c++) {
line += " ";
}
}
System.out.println(line);
amDigits = 0;
line = "";
wordsOfLine = new ArrayList<String>();
i--;
}
}
}
}
最佳答案
所有代码都塞在 public static void main 中。创建至少两个具有直观名称的方法,以解释它们的作用以使其更具可读性。这样我就可以浏览一下并了解您正在做的事情的主题。
for 循环在循环的每次迭代中检查数组的大小。每次迭代都重新扫描数组会浪费处理器时间。
不要将类称为“main”,而是为其指定一个名称来说明其功能。例如“SetFormattedSpacingWidth”或捕捉其本质的东西。
有一个三重嵌套的 for 循环。三重嵌套的 for 循环通常可以以多态方式重写,以仅具有一个或最多两个 for 循环。
您正在使用旧的 for 循环方式,而不是这样:
for(int b = 0; b < wordsOfLine.size(); b++) {
line += wordsOfLine.get(b);
//access words via: wordsOfLine.get(b);
}
使用新的java foreach loop减去一行并使其更具可读性。
for(String words : wordsOfLine) {
//access words via: 'words'
}
在递增 i 的 for 循环内递减 i--
?这确实令人困惑。
可能会发生被零除异常。你甚至不需要捕获那些。它们应该是不可能发生的。
这是我对这个有趣问题的尝试:
import java.io.IOException;
import java.util.ArrayList;
public class DoFormattedColumnWidth {
public static void main(String[] args) {
String msg = "Contrary to popular belief, Lorem Ipsum is not simply " +
"random text. It has roots in a piece of classical Latin " +
"literature from 45 BC, making it over 2000 years old. Richard " +
"McClintock, a Latin professor at Hampden-Sydney College in " +
"Virginia, looked up one of the more obscure Latin words, " +
"consectetur, from a Lorem Ipsum passage, and going through the " +
"cites of the word in classical literature, discovered the " +
"undoubtable source. Lorem Ipsum comes from sections 1.10.32 and " +
"1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good " +
"and Evil) by Cicero, written in 45 BC. This book is a treatise on " +
"the theory of ethics, very popular during the Renaissance. The first " +
"line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a " +
"line in section 1.10.32.";
ArrayList<String> lines =
justifyText(msg, 25);
for(String line : lines){
System.out.println(line);
}
}
public static ArrayList<String> justifyText(String text, int width){
ArrayList<String> lines = new ArrayList<String>();
String[] words = text.split(" ");
String currentLine = "";
int currentWord = 0;
int len = words.length;
int numberOfWordsThisLine=0;
while (currentWord < len){
if ((currentLine.length() + words[currentWord].length()) <= width ||
(currentLine.length() + words[currentWord].length()) > width &&
numberOfWordsThisLine == 0){
currentLine = currentLine + " " + words[currentWord];
currentWord++;
numberOfWordsThisLine++;
if (currentWord == len)
lines.add(currentLine.trim());
}
else{
currentLine = infuseLineWithSpaces(currentLine.trim(),
width - (currentLine.trim().length()));
lines.add(currentLine.trim());
currentLine = "";
numberOfWordsThisLine=0;
}
}
return lines;
}
public static String infuseLineWithSpaces(String text, int numSpaces){
String newText = "";
if (numSpaces == 0) return text;
else if (numSpaces == 1) return text + " ";
else if (numSpaces > 1){
String[] words = text.split(" ");
int numberOfWords = words.length;
int left = (numSpaces + (numberOfWords-1));
int right = ((words.length-1));
int numberSpacesToAddEachWord = (int)((double)left / (double)right);
for(int x = 0; x < numberOfWords; x++){
if (x == numberOfWords)
newText = newText + words[x];
else
newText = newText + words[x] + getSpaces(numberSpacesToAddEachWord);
}
}
else
return text;
return newText;
}
public static String getSpaces(int spaces){
String text = "";
for(int x = 0; x < spaces; x++){
text+= " ";
}
return text;
}
}
哪些输出:
Contrary to popular
belief, Lorem Ipsum is
not simply random text.
It has roots in a piece
of classical Latin
literature from 45 BC,
making it over 2000 years
old. Richard McClintock,
a Latin professor at
Hampden-Sydney College in
Virginia, looked up one
of the more obscure Latin
words, consectetur, from
a Lorem Ipsum passage,
and going through the
cites of the word in
classical literature,
discovered the
undoubtable source. Lorem
Ipsum comes from sections
1.10.32 and 1.10.33 of
"de Finibus Bonorum et
Malorum" (The Extremes of
Good and Evil) by Cicero,
written in 45 BC. This
book is a treatise on the
theory of ethics, very
popular during the
Renaissance. The first
line of Lorem Ipsum,
"Lorem ipsum dolor sit
amet..", comes from a
line in section 1.10.32.
它并不完美,因为单词之间的间距是由行中的单词数除以填充间隙所需的额外空格数来确定的,因此右行并不完全合理。但它比以前更有道理。
关于Java,在控制台中精确地间隔文本中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17793512/
我有以下数据框 (df_hvl),列名“FzListe”和以下数据: FzListe 7MA1, 7OS1 7MA1, 7ZJB 7MA2, 7MA3, 7OS1 76G1, 7MA1, 7OS1 7
我有点小问题。仅当尝试写入的相同字符串/单词不存在时,我才想写入文件。在我的例子中,它是一个 IP 地址和端口,用“:”分隔。如果我手动写入文件,例如 193...:80 和 193...:22,它指
如何返回结果列中的单词示例? 我得到的最接近的是 [\W]{2,}[^,\W].+[?=,] ID 文本 我的结果(完全匹配) 预期(完全匹配) 1 词A,世界B,词C , 世界 B, 字B 2 wo
我想在引号之间得到一个字符串 我知道一个解决方案是: /'.*?'/ 但问题是它不适用于英语中的所有格或收缩格 例如: What is the name of Mario's brother in t
我应该在句子中找到出现最多的单词。 这是我尝试过的,但不起作用。 '); $max = -1; $resultWords = array(); $resultCount = array(); $i =
我是vim的新手。我正在尝试练习(最近阅读了一些教程),但是我发现我不能不突出显示“复制粘贴”中的字符/单词/行。 在Textmate中,我通常使用SHIFT + CTRL + LeftArrowKe
有谁知道一个JSON格式的英语词典,该词典具有(单词,定义和单词类型,例如名词/形容词/动词/副词) 这种格式: [ {"Word" : "Chair", "Definition" : "A
我正在做一些 javascript,同时我注意到我无法替换 html 标记内的“ document.getElementById('label').innerHTML = document.get
您好,我正在使用 groovy 2.1.5,我必须编写一个代码来显示具有给定路径的目录的内容/文件,然后它会备份文件并替换文件中的单词/字符串。 这是我用来尝试替换所选文件中的单词的代码 String
我正在准备一个实验,我想使用python编写程序以识别参与者说出的某些单词。 我在python中搜索了很多有关语音识别的内容,但结果却很复杂(例如CMUSphinx)。 我要实现的是一个程序,该程序接
假设我有以下代码: $size = 23.9 $size = "$size GB" write $size 我想在其他事情上使用相同的变量,即 if ($size -lt 20) {...} 这显然是
我想替换字符串中单词 Date 的所有情况,除非它是 Date()(即 Date 后跟括号)。这是一个字符串示例以及我最初尝试的内容: x gsub("Date", paste("Date:", S
我对 Java 和编程都很陌生,请记住这一点,请不要对我严厉 ^^。接下来,我最近用 Java 进行了一些培训,我喜欢这个挑战,但现在我只是陷入困境。我做了一些示例来查找用户输入的最大字符串,一切都很
我必须给一个数字x,并写x个字符串(单词)。我必须找到写得最多的那一篇。它可以工作,但是当我尝试从文件中读取它时,却没有。例如,如果我执行 a.out'' #include #include in
这里是学习者,如果这个问题看起来很荒谬,请多多包涵。假设我试图引用字符串中的字符而不是字符串本身,我该怎么做呢?我的意思是; 给定:var str = "我想知道一个大脑分散的计算机如何保持理智" 我
这是阿克沙塔。我一直在解析以下数据。我想单独获取每个单词。我可以有一个示例代码以便我可以继续吗 RTRV-HDR RH01 SIMULATOR 09-11-18 16 13 19 M R
我有一个任意字符串,它总是包含至少一个英文单词后跟一系列数字:"Hello World 1234" 我如何只提取 "Hello World" 来自字符串? 最佳答案 在我看来你需要反正则表达式: St
我正在尝试输入一个四个单词的句子,然后能够使用indexOf和子字符串单独打印出每个单词。有什么想法我做错了吗? 已编辑 那么这就是它应该的样子吗?我已经运行了两次,得到了两个不同的答案,所以我不确定
如何在文本开头查找短语(单词) 我需要非常快速的解决方案来查明文本是否以某些已知短语开头 我在 Mysql (innodb) 表中的短语如下: CREATE TABLE IF NOT EXISTS `
我在 MYSQL 表中有一本字典,该表由 240 000 个单词组成。例如,如果我有字母 G、I、G、S、N> 和 O 我想选择表中包含所有或部分这些字母(并且没有其他字母)的所有单词。 可接受的词语
我是一名优秀的程序员,十分优秀!