将字符串转换为对象参数

时间:2018-12-03 16:32:10

标签: java

该程序是一个文本引擎,可以接收文本文件并对其进行分析。

public Word findFirst(String text) throws SearchableException, ContentNotLoadedException {
    for(int i = 0;i<words.size();i++) {
        if(text.equals(words.get(i).text)) {
            return words.get(i).text;
        }
    }   
}

这是一种应返回与输入“文本”匹配的单词的第一个实例的方法。 “单词”是加载所有单词的数组列表。我在return语句中收到“无法从字符串转换为单词”的错误,虽然我理解该错误,但我无法想到执行此操作的另一种方法?

public class Word {

public final String text;
public final int position;
public final int length;
public final int line;
public final int positionInLine;

 public Word(String text, int position, int length, int line, int positionInLine) {
    this.text = text;
    this.position = position;
    this.length = length;
    this.line = line;
    this.positionInLine = positionInLine;
}

这是有问题的Word类。

编辑:我无法以任何方式更改方法签名或Word类。

4 个答案:

答案 0 :(得分:2)

如果您使用的是Java-8,则可以使用它返回匹配的第一个字符串:

public String findFirst(String text) throws SearchableException {
    return words.stream().filter(i -> i.text.equals(text)).findFirst().get().text;
}

或者,如果您想返回整个对象,则可以使用:

public Word findFirst(String text) throws SearchableException {
    return words.stream().filter(i -> i.text.equals(text)).findFirst().get();
}

答案 1 :(得分:1)

实际上,该方法的返回类型为Word,因此当您的return给出String时,它不能从StringWord。 / p>

  1. 要解决此问题,请将返回类型更改为String

    public String findFirst(String text) throws SearchableException, ContentNotLoadedException {
        for(int i = 0;i<words.size();i++) {
            if(text.equals(words.get(i).text)) {
                return words.get(i).text;
            }
        }        
    }
    
  2. 或返回整个Word对象

    public Word findFirst(String text) throws SearchableException, ContentNotLoadedException {
        for(int i = 0;i<words.size();i++) {
            if(text.equals(words.get(i).text)) {
                return words.get(i);
            }
        }        
    }
    

提示以简化循环

  1. foreach循环

    for (Word word : words) {
        if (text.equals(word.text)) {
            return word.text;
        }
    }
    
  2. return words.stream().map(Word::getText).filter(text::equals).findFirst().orElseThrow(()->new SearchableException());
    

答案 2 :(得分:1)

只需return words.get(i)即可代替return words.get(i).text

public Word findFirst(String text) throws SearchableException, ContentNotLoadedException {
    for(int i = 0;i<words.size();i++) {
        if(text.equals(words.get(i).text)) {
            return words.get(i);
        }
    }   
return null;
}

答案 3 :(得分:0)

由于不能更改方法签名,因此必须返回Word实例。因此,您不应返回Word.text,而应直接返回Word实例或新的实例。