我的代码应该将给定的String分开,并将所选的字母转换为#,并将这些单词与所选字母分开并连接起来。我的问题是我的代码中的一个方法(allWordsWith),它不允许我返回一个String数组。 (p.s,运行这个的代码是无关紧要的,我不应该编辑那些代码)。
import java.util.Arrays;
import java.util.Scanner;
public class LipogramAnalyzer {
private String line;
public LipogramAnalyzer(String text){
line = text;
}
public String mark (char letter){
String replaceletters = line.replace(letter, '#');
return replaceletters;
}
public String[] allWordsWith (char letter){
String[] arr = line.split(" ");
for ( String ss : arr) {
String ary[] = {ss};
for(int i = 0; i < ary.length; i++){
int numindex = ss.indexOf(letter);
if (numindex != -1){
String result = ary[i];
return result;
}
}
}
}
}
答案 0 :(得分:2)
“它不允许我返回一个字符串数组”
当然可以。您正在尝试返回String
:
String result = ary[i];
return result;
即使返回类型是字符串数组:
public String[] allWordsWith (char letter){
您需要返回一个数组,因为allWordsWith
表示您需要多个值。
但更大的问题是您正在将结果数组初始化为单个元素
String ary[] = {ss};
初始化后无法更改数组的长度。这意味着此循环中的ary.length
for(int i = 0; i < ary.length; i++){
总是等于一个。那不是你想要的。
此外,您正在搜索结果数组(ary
)中的字符串,即使您刚创建它,也就是说 中没有任何内容< / em> - 也就是说,所有值都是null
。
如果您想要line
中包含letter
的所有字符串的列表,请尝试
public String[] allWordsWith (char letter){
String[] asAllWordsInLine = line.split(" ");
java.util.ArrayList<String> alsAllWordsWithChar = new java.util.ArrayList<String>();
for ( String ss : asAllWordsInLine) {
if(ss.indexOf(letter) != -1) {
alsAllWordsWithChar.add(ss);
continue; //No need to check any more letters.
}
}
return alsAllWordsWithChar.toArray(new String[alsAllWordsWithChar.size()]);
}
我已将数组更改为列表,因为您无法知道其中有多少个字符串letter
。列表可以更改大小,数组不能。当没有字符串匹配时,这将返回一个空数组which is preferred over null
。 (more info)
我还使变量名称更有意义,并在匹配一个字符后使用continue
停止检查一个字,这会使当前的for循环迭代短路。)
最后,在分析所有字符串之前,该函数没有返回任何内容,这意味着在for循环完成之后。在原始代码中,return
位于循环内,意味着只返回第一个字符串。
有用的测试功能:
public static final void main(String[] igno_red) {
testLine('b', "abc def ghi cba def ghi");
}
private static final void testLine(char c_letter, String s_line) {
System.out.println("Line: \"" + s_line + "\"");
String[] asAllWordsWith = (new LipogramAnalyzer(s_line)).allWordsWith(c_letter);
System.out.println("Words with '" + c_letter + "': " + Arrays.toString(asAllWordsWith));
}
答案 1 :(得分:1)
返回ary
而不是ary[i]
for(int i = 0; i < ary.length; i++){
int numindex = ss.indexOf(letter);
if (numindex != -1){
String result = ary[i];
/*here*/ return ary;
}
答案 2 :(得分:0)
您可以返回一个数组。请尝试使用return ary
代替return ary[i]
。
此外,您的函数必须在所有情况下返回一些内容。换句话说,你必须在for循环之后有一个return语句。
答案 3 :(得分:0)
您正在尝试返回String
而不是String[]
(字符串数组)
更改代码:
if (numindex != -1) {
String result = ary[i];
return result;
}
要:
if (numindex != -1) {
return new String[]{ary[i]};
}
// afrer first for loop
return arr;
答案 4 :(得分:0)
public String[] allWordsWith (char letter){
String[] arr = line.split(" ");
for ( String ss : arr) {
String ary[] = {ss};
for(int i = 0; i < ary.length; i++){
int numindex = ss.indexOf(letter);
if (numindex != -1){
String result = ary[i];
// or here return ary;
}
}
}
return ary;
}
返回数组
答案 5 :(得分:0)
如果你想一次返回一个完整的String-Array,我修改了你的函数(未测试):
public String[] allWordsWith (char letter){
String[] arr = line.split(" ");
String[] result = new String[ary.length];
for ( String ss : arr) {
String ary[] = {ss};
for(int i = 0; i < ary.length; i++){
int numindex = ss.indexOf(letter);
if (numindex != -1){
result[i] = ary[i];
}
}
}
return result;
}
答案 6 :(得分:0)
如前所述,您将返回String而不是String []。另请注意,您的代码只返回一个“单词”。我修改了您的代码以添加包含您的角色的每个单词并将其添加到List。在循环结束时,List被转换为String []。
public String[] allWordsWith(char letter)
{
String[] arr = line.split(" ");
List<String> result = new ArrayList<>();
for (String ss : arr) {
int numindex = ss.indexOf(letter);
if (numindex != -1) {
result.add(ss);
}
}
return result.toArray(new String[result.size()]);
}