为什么我不能提取列表元素的索引?
protected void writeString(String string,
List<TextPosition> textPositions)
throws IOException {
System.out.println("string:"+ string);
// Outputs string:Hello world
System.out.println("text"+ textPositions);
// Outputs text:[H, e, l, l, o, , w, o, r, l, d, ]
System.out.println("indexofchar:"+ textPositions.indexOf('w'));
// Outputs indexofchar -1
}
string:Hello world
text:`[H, e, l, l, o, , w, o, r, l, d, ]`.
我希望indexofchar
的输出为6,但实际为-1
答案 0 :(得分:0)
您正在将字符文字与列表中的每个TextPosition
项目进行比较。这是行不通的。您需要将TextPosition('w')
的实例与列表中的每个项目进行比较。为此,您需要覆盖hashCode
和equals
。
System.out.println("indexofchar: " + textPositions.indexOf(new TextPosition('w'))); // 6
import java.util.*;
import java.util.stream.Collectors;
public class PositionFinder {
private static final List<TextPosition> stringToTextPositions(String s) {
return Arrays.asList(s.split("")).stream().map(c -> new TextPosition(c.charAt(0))).collect(Collectors.toList());
}
protected void writeString(String string, List<TextPosition> textPositions) {
System.out.println("string: " + string);
System.out.println("text: " + textPositions);
System.out.println("indexofchar: " + textPositions.indexOf(new TextPosition('w'))); // 6
}
public static void main(String[] args) {
String text = "Hello world";
List<TextPosition> textPositions = stringToTextPositions(text);
new PositionFinder().writeString(text, textPositions);
}
}
不确定您的样子,但这是到目前为止我了解的基本POJO。
public class TextPosition {
private char value;
public TextPosition(char value) {
this.value = value;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.value;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
TextPosition other = (TextPosition) obj;
if (value != other.value) return false;
return true;
}
@Override
public String toString() {
return Character.toString(this.value);
}
}
答案 1 :(得分:0)
为什么无法从列表中提取文本。
不清楚您的意思是“提取文本”。但是显然TextPosition
对象不是文本,因此这里没有文本列表。
无论哪种方式,该表达式都无法使用。
textPositions.indexOf('w')
textPositions
对象是List<TextPosition>
。这意味着indexOf
方法将Object
作为参数:请参见javadoc。
您正在使用字符文字作为参数来调用它。那是原始值,不是参考值,但是Java会将其自动装箱到Character
对象。
因此,现在您正在Character
实例列表中搜索TextPosition
。 Character
实例不能可能等于TextPosition
实例。因此,自然indexOf
将始终返回-1
。
那么……您将如何在TextPosition
个对象的列表中搜索字符?好吧,假设 1 TextPosition
实际上是org.apache.pdfbox.util.TextPosition
(javadoc),我们看到它有一个getCharacter()
方法返回
“存储在此对象中的字符串”。
所以我们可以做这样的事情:
String w = Character.toString('w');
for (int i = 0; i < textPositions.size(); i++) {
if (textPositions.get(i).character().equals(w)) {
return i;
}
}
return -1;
这可以使用流更优雅地完成...
1-如果我对TextPosition
的假设不正确,则应该有一种方法可以以某种形式提取该位置所表示的字符。