Код для поиска в строке, если он содержит массив Char []? - PullRequest
2 голосов
/ 28 марта 2011

Я разрабатываю приложение, в котором есть функция поиска текста (searchString) на арабском языке, если он находится в файле .txt (файл .txt также на арабском языке).

Поскольку Android не поддерживает арабский на 100%, String.indexof() не работает должным образом.Итак, я подумал, я бы положил searchString в массив Char[] и вместо сравнения всего слова я сравниваю каждый символ.Поэтому я помещаю searchString в char[] и начинаю сравнивать массив со строкой

Имеется ли где-нибудь код, который ищет, находится ли последовательность в массиве char [] в строке?

пример:

char[]={t,e,s,t}  String1{qqwtestq} String2{qwqtqwe}  -> String1:TRUE   String2:FALSE

Спасибо

Ответы [ 4 ]

1 голос
/ 28 марта 2011

Реализация KMP!
http://en.m.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

EDIT
Извините, я не знал об арабском языке на Android.Некоторые предложения указывают на Cyanogen , и что только Android 3.0 поддерживает арабский язык.

1 голос
/ 28 марта 2011

indexOf и contains не используют какую-либо кодировку символов, и вы можете использовать символы, которые, например, не используются в вашей кодировке символов.то есть он игнорируется для этих функций.

All String.indexOf () и содержит символ сравнения для символа.Я не уверен, какое поведение вы ожидаете от 100% арабской поддержки.Вот упрощенная версия того, что indexOf () / contains () делает

public static int indexOf(String string, char[] chars) {
    LOOP:
    for (int i = 0; i < string.length() - chars.length; i++) {
        for (int j = 0; j < chars.length; j++)
            if (string.charAt(i + j) != chars[j])
                continue LOOP;
        return i;
    }
    return -1;
}

public static void main(String args[]) {
    char[] chars = "test".toCharArray();
    String one = "qqwtestq";
    String two = "qwqtqwe";
    String str = new String(chars);
    System.out.println("indexOf(" + one+", " + Arrays.toString(chars) + ") = " + indexOf(one, chars));
    System.out.println(one + ".indexOf(" + str + ") = " + one.indexOf(str));
    System.out.println("indexOf(" + two+", " + Arrays.toString(chars) + ") = " + indexOf(two, chars));
    System.out.println(two + ".indexOf(" + str + ") = " + two.indexOf(str));

    char[] chars2 = { '\uffff', '\uFeFF' };
    String test = "qqw\uffff\uFeFFq";
    String str2 = new String(chars2);
    System.out.println("indexOf(" + test+", " + Arrays.toString(chars2) + ") = " + indexOf(test, chars2));
    System.out.println(test + ".indexOf(" + str2 + ") = " + test.indexOf(str2));
}

Prints

indexOf(qqwtestq, [t, e, s, t]) = 3
qqwtestq.indexOf(test) = 3
indexOf(qwqtqwe, [t, e, s, t]) = -1
qwqtqwe.indexOf(test) = -1
indexOf(qqw??q, [?, ?]) = 3
qqw??q.indexOf(??) = 3

Можете ли вы привести пример, где этот метод не работает?

РЕДАКТИРОВАТЬ: Этот тест проверяет все возможные символы, чтобы увидеть, работает ли indexOf, как ожидалось.то есть то же самое для каждого возможного символа.

for(int i=Character.MIN_VALUE;i<= Character.MAX_VALUE;i++) {
    String find = new String(new char[] {(char) i});
    String str = new String(new char[] {(char) (i+1), (char) i});
    String str1 = new String(new char[] {(char) (i+1)});

    int test1 = str.indexOf(find);
    if (test1 != 1)
        throw new AssertionError("test1 failed i="+i);

    int test2 = str1.indexOf(find);
    if (test2 != -1)
        throw new AssertionError("test2 failed i="+i);
}

Не находит расхождений.

0 голосов
/ 28 марта 2011

Как насчет этого?

    char[] ch = { 't', 'e', 's', 't' };

    String string1 = "qqwtestq";
    if (string1.contains((new StringBuffer()).append(ch)))
        System.out.println("true");
    else
        System.out.println("false");
0 голосов
/ 28 марта 2011

Попробуйте StringUtils содержит метод.

...