Ошибка списка-массива? - PullRequest
       9

Ошибка списка-массива?

0 голосов
/ 17 января 2010

Я работал над проектом, который требовал снятия и анализа HTML-страницы с сервера, а затем синтаксического анализа содержимого. Я искал строку для двух значений в качестве модульного теста, затем сохранил каждое из них в список, а затем сравнил их с созданной вручную строкой []. Код ниже:

SiteGrabber.java:

//some imports
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JOptionPane;


public class SiteGrabber {

//constructor and java.net stuff

public List<String> getWords(String content){
    int prev = 0;
    List<String> res = new ArrayList<String>();
    String tar = "<tr> <td></td><td><li>";
    int tarlen = tar.length();
    while(content.indexOf(tar, prev) != -1){
        int contentind = content.indexOf("</li>", prev);
        if(contentind != -1){
            res.add(
                content.substring(
                    content.indexOf(tar, prev) + tarlen,
                    content.indexOf("</li>", content.indexOf(tar, prev))));
            prev = contentind + 5;
        }
        else{break;}
    }
    return res;
}

}

SiteGrabberTest.java:

import java.util.List;

import org.junit.Test;

import junit.framework.Assert;

public class SiteGrabberTest {

String htsTest="<tr> <td>List of scrambled words:&nbsp;&nbsp;&nbsp;</td> <td><li>nielle</li></td> </tr><tr> <td></td><td><li>ierneb</li></td> </tr>";
//I want the text between the </td><td><li>...</li> tags.
//2 working tests that show that it sets the List.size() to 0 on a dummy string
//and that it records the right number of results in the List on a valid input.


@Test public void ValidContentTest(){
    SiteGrabber myGrabber = new SiteGrabber();
    List<String> mylst = myGrabber.getWords(htsTest);

    String[] expected = new String[] {"nielle", "ierneb"};
    Assert.assertEquals("wrong size", expected.length, mylst.size());
    for (int i = 0; i < expected.length; i++) {
        Assert.assertEquals("wrong word", expected[i], mylst.get(i));
                    //breaks on 1st iteration, saying it expects "nielle" and got
                    //">ierneb", implying some sort of off-by-one error.
    }


}
}

Ответы [ 2 ]

1 голос
/ 17 января 2010

Изменение:

content.indexOf(tar, prev) + tarlen

до:

content.indexOf(tar, prev) + tarlen + 1
0 голосов
/ 17 января 2010

Я подозреваю, что здесь ...

content.substring(
                content.indexOf(tar, prev) + tarlen,
                content.indexOf("</li>", content.indexOf(tar, prev))));

Вы обнаружите свою проблему "один на один" ... точнее,

content.indexOf("</li>", content.indexOf(tar, prev))

... as content.indexOf(tar, prev) возвращает индекс (который будет в диапазоне от 0 до n-1), и вы пытаетесь использовать его как длину (которая должна находиться в диапазоне от 1 до n).
Звук примерно так?

Попробуйте добавить туда "+1" ...

content.indexOf("</li>", content.indexOf(tar, prev)+1)

Кроме того, ваша техника не будет работать для всех документов HTML. Вы должны либо использовать правильную библиотеку / инструмент для разбора HTML, либо фактически анализировать HTML, элемент за элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...