为什么无法从列表中提取文本

时间:2019-01-29 11:24:51

标签: java collections

为什么我不能提取列表元素的索引?

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

2 个答案:

答案 0 :(得分:0)

您正在将字符文字与列表中的每个TextPosition项目进行比较。这是行不通的。您需要将TextPosition('w')的实例与列表中的每个项目进行比较。为此,您需要覆盖hashCodeequals

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实例列表中搜索TextPositionCharacter实例不能可能等于TextPosition实例。因此,自然indexOf将始终返回-1


那么……您将如何在TextPosition个对象的列表中搜索字符?好吧,假设 1 TextPosition实际上是org.apache.pdfbox.util.TextPositionjavadoc),我们看到它有一个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的假设不正确,则应该有一种方法可以以某种形式提取该位置所表示的字符。