我正在读“暴露编程访谈”一书,以下问题对我来说很有趣:
编写一个反转字符串中单词顺序的函数。对于 例如,你的函数应该转换字符串“Do or do not, 没有尝试。“试试。”不,没有,做或做“。假设全部 单词是空格分隔的,并将标点符号与字母相同。
包含此图像以帮助设计算法:
在JAVA中实现此功能的最有效方法是什么?
答案 0 :(得分:5)
final List<String> a = Arrays.asList("Do or do not, there is no try.".split("\\s+"));
Collections.reverse(a);
final Iterator<String> it = a.iterator();
final StringBuilder b = new StringBuilder(it.next());
while (it.hasNext()) { b.append(" "); b.append(it.next()); }
System.out.println(b);
答案 1 :(得分:2)
根据空格分割单词。将单词放入堆叠中,并在到达字符串末尾时弹出单词。
//push elements onto stack
for(int k =0; k < strtest.length ; k++)
{
if(strtest[k]!=null)
{
stack.push(strtest[k]);
}
}
StringBuffer b1 = new StringBuffer("");
// pop and put in stringbuffer
while(!stack.isEmpty())
{
b1 = b1.append(stack.pop());
b1.append(" ");
}
答案 2 :(得分:1)
嗯,我希望这不是一个家庭作业,但这是一种方法:
String input = "piglet quantum";
String[] words = input.split(" ");
String result = "";
for(String word : words) {
result = word + " " + result;
}
// This is to remove the extra space (sorry!)
result = result.substring(0, result.length() - 1);
但这并不严格遵循图像中描述的方法。他们希望您将单词视为数组,因此他们可能会让您使用substring()
和charAt()
来处理此问题。
答案 3 :(得分:1)
这是一种非常直接的方法:
String theInput = "Do or do not, there is no try.”;
String[] wordArray = theInput.split(" ");
String[] reverseWordArray = new String[wordArray.length];
int j = 0;
for (int i = wordArray.length; i > 0; i --) {
reverseWordArray[j++] = wordArray[i-1];
}
答案 4 :(得分:0)
这是一种低级(-er)级别的方式(我认为):
String in = "piglet quantum";
String out = "";
for(int i = in.length()-1; i >= 0; i+=0) {
out += in.substring(in.lastIndexOf(" ", i-1), i)+" ";
i = in.lastIndexOf(" ", i-1);
}
out.substring(0, out.length()-1);
就像我说的,不确定这是否有效,但我认为它会。
如果有人提出建议,我不知道如何处理for
中的最后一个条件。它不应该做任何事情。
答案 5 :(得分:0)
BreakIterator也是一个选项:
import java.text.BreakIterator;
public class ReverseWord {
public static void main(String[] args) {
String source = "piglet quantum";
BreakIterator boundary = BreakIterator.getWordInstance();
boundary.setText(source);
int end = boundary.last();
StringBuilder sb = new StringBuilder();
for (int start = boundary.previous(); start != BreakIterator.DONE; end = start, start = boundary.previous()) {
sb.append(source.substring(start, end));
}
String reversed = sb.toString();
System.err.println("'" + reversed + "'");
}
}
它输出:
'量子仔'