Найти определенный символ в массиве символов - PullRequest
1 голос
/ 28 сентября 2011

Я делаю приложение, в котором я хочу найти определенный символ в массиве символов. Другими словами, у меня есть следующий массив символов:

char[] charArray= new char[] {'\uE001', '\uE002', '\uE003', '\uE004', '\uE005', '\uE006', '\uE007', '\uE008', '\uE009'};

В какой-то момент я хочу проверить, существует ли символ '\uE002' в charArray. Мой метод состоял в том, чтобы сделать цикл для каждого символа в charArray и найти, существует ли он.

for (int z = 0 ; z < charArray; z ++) {
    if (charArray[z] == myChar) {
        //Do the work
    }
}

Есть ли какое-либо иное решение, кроме создания массива символов и поиска символа с помощью цикла каждого символа?

Ответы [ 6 ]

3 голосов
/ 28 сентября 2011

Один из вариантов - предварительно отсортировать charArray и использовать Arrays.binarySearch(charArray, myChar).Неотрицательное возвращаемое значение будет означать, что myChar присутствует в charArray.

char[] charArray = new char[] {'\uE001', '\uE002', '\uE003', '\uE004', '\uE005', '\uE006', '\uE007', '\uE008', '\uE009'};
Arrays.sort(charArray); // can be omitted if you know that the values are already sorted
...
if (Arrays.binarySearch(charArray, myChar) >= 0) {
  // Do the work
}

edit Альтернативой, которая избегает использования модуля Arrays, является размещение символовв строку (во время инициализации), а затем используйте String.indexOf () :

String chars = "\uE001...";
...
if (chars.indexOf(myChar) >= 0) {
   // Do the work
}

Это не сильно отличается от того, что вы уже делаете, за исключением того, что требует меньшекод.

Если n - размер charArray, первое решение - O(log n), а второе - O(n).

1 голос
/ 28 сентября 2011

Вы можете использовать net.rim.device.api.util.Arrays.getIndex(char[] array, char element)

1 голос
/ 28 сентября 2011

Если у вас нет доступа к массивам, так как вы работаете в JavaME, то вам следует попробовать:

  • Или реализуй отсортированный массив и сам бинарный поиск
  • Или просто используйте решение O (n), которое в любом случае является хорошим решением.

Ваше решение - O (n), а также решение, указанное в aix.

Вы можете попытаться использовать карту, но это будет зависеть от количества элементов в вашем массиве. Если вы думаете, что в массиве будет не более 1000 элементов, просто используйте решение O (n). Но если вы думаете, что у вас может быть неизвестное количество элементов, карта будет разумным выбором, предоставляя лучшее решение.

1 голос
/ 28 сентября 2011

Вы можете использовать хэш / карту, чтобы проверить существование персонажа. Этот подход имеет лучшее время O (log n) или O (1) в зависимости от внутренней структуры хеша / карты.

0 голосов
/ 28 сентября 2011

Это зависит от того, какую конфигурацию / профиль Java ME вы используете.Если вы находитесь на CDC, проверьте, какие части платформы Java SE 1.3 Collections поддерживаются (просто найдите javadocs, предназначенные для вашего устройства, и посмотрите в пакете java.util).Стоит также проверить, есть ли на вашем устройстве какие-то специфичные для Blackberry расширения API для работы с коллекциями.

Если вы ограничены минимальным значением CLDC / MIDP, тогда другим решением, помимо упомянутого, будет добавление символов в Vector.и использовать Vector.contains (Объект)

0 голосов
/ 28 сентября 2011

Если вы не хотите реализовывать это самостоятельно, вы можете использовать ArrayUtils в проекте Apache Commons:

ArrayUtils apache-commons

...