Почему невозможно извлечь текст из списка - PullRequest
0 голосов
/ 29 января 2019

Почему я не могу извлечь индекс элемента списка ??

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 голосов
/ 29 января 2019

Почему нельзя извлечь текст из списка.

Непонятно, что вы имеете в виду под «извлекать текст».Но ясно, что 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 неверно, должен быть способ извлечь символы, обозначенные позицией в некоторой форме.

0 голосов
/ 29 января 2019

Вы сравниваете символьный литерал с каждым 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...