Проблема с подчеркиванием (_) в Collections.binarySearch (Java) - PullRequest
0 голосов
/ 26 апреля 2010

Проблема:

Я использую Java Tutorials ™ исходный код для этого. Это исходный код .

Я пробовал это:

--following with another section of sorted words--
words.add("count");
words.add("cvs");
words.add("dce"); 
words.add("depth");
--following with another section of sorted words--

и работает отлично. Однако, когда я использую это:

--just a section of sorted words--
words.add("count");
words.add("cvs");
words.add("dce_iface"); 
words.add("dce_opnum");
words.add("dce_stub_data");
words.add("depth");
--following with another section of sorted words--

Это показывает dce_iface, когда я набираю dce, но когда я набираю _, а затем после o или s, это показывает мне что-то еще, например dce_offset, где смещение происходит от words.add("fragoffset"); где-то в списке.

Что я могу сделать, чтобы решить эту проблему? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 26 апреля 2010

Я думаю, вы должны добавить подчеркивание как "букву" здесь

        // Find where the word starts
        int w;
        for (w = pos; w >= 0; w--) {
            if (!Character.isLetter(content.charAt(w))) {
                break;
            }
        }
1 голос
/ 26 апреля 2010

Это связано с этим разделом в insertUpdate():

// Find where the word starts
int w;
for (w = pos; w >= 0; w--) {
    if (! Character.isLetter(content.charAt(w))) {
        break;
    }
}

В частности, Character.isLetter() возвращает false для символа подчеркивания. Это означает, что слово начинается после позиции подчеркивания.

Чтобы решить эту проблему, вам нужно изменить оператор if, чтобы разрешить использовать любые не буквенные символы, которые вы хотите использовать в словах. Вы можете явно проверить '_' или использовать Chacter.isWhiteSpace(), чтобы включить все символы, которые не являются пробелом, символом табуляции или новой строки.

1 голос
/ 26 апреля 2010

Это, вероятно, из-за этих строк в коде:

for (w = pos; w >= 0; w--) {
    if (! Character.isLetter(content.charAt(w))) {
        break;
    }
}

_ не является буквенным символом, поэтому он обрабатывает его так же, как пробел.Вы можете попробовать изменить условие на:

char c = content.charAt(w);
if (! (Character.isLetter(c) || c == '_')) {
...