соответствуйте массиву против строки в Java

Adam только частично прав. Многие, если вообще, математики никогда не будут касаться его. Если существует компьютерный инструмент, используемый вообще, это будет чем-то как Mathematica или Клен . Технические отделы, с другой стороны, часто полагаются на него и существуют определенно полезные вещи для некоторых прикладных математиков. Это также используется в большой степени в промышленности в некоторых областях.

Что-то, что необходимо понять о MATLAB, - то, что он начался как обертка на библиотеки Fortran для линейной алгебры. В течение долгого времени это имело отношение, из которого "весь мир является массивом, удваивается (плавает)". Как язык, это выросло очень органически, и существуют некоторые дефекты, которые очень испеклись в, если Вы смотрите на него так же, как на язык программирования.

Однако при рассмотрении его как среды для того, чтобы выполнить в определенных типах исследования это имеет некоторые реальные преимущества. Это почти столь хорошо, как это добирается для того, чтобы сделать линейную алгебру с плавающей точкой. Нотация проста и мощна, реализация быстро и доверяла. Это очень хорошо в генерации графиков и других интерактивных задач. Существует большое количество 'панелей инструментов' с хорошим кодом для конкретных задач, которые доступны. Существует многочисленное сообщество пользователей, которые совместно используют числовые коды (Python + , NumPy ничего не имеет в той же лиге, по крайней мере, еще)

, Python, бородавки и все, является намного лучшим языком программирования (как многие другие). Однако это - приблизительно одно десятилетие позади с точки зрения инструментов.

ключевой пункт - то, что большинство людей, которые используют MATLAB, не является программистами действительно и не хочет быть.

Это - паршивый выбор для общего языка программирования; это является изворотливым, медленным для многих задач (необходимо векторизовать вещи получить эффективные коды), и не легкий интегрироваться с внешним миром. С другой стороны, для вещей это способно, это очень очень хорошо. Очень немного вещей выдерживают сравнение. Существует компания с разумной поддержкой и кто знает, сколько годы человека помещали в него. Это может иметь значение в промышленности.

Строго рассмотрение Вашего Python по сравнению со сравнением MATLAB, они - главным образом различные инструменты для различных заданий. В областях, где они действительно накладываются немного, трудно сказать, что лучший маршрут пойти (во многом зависит от того, что Вы пытаетесь сделать). Но главным образом Python не весь настолько хорош в базовых преимуществах MATLAB, и наоборот.

5
задан karunga 4 November 2009 в 08:40
поделиться

3 ответа

Скопируйте все значения в Set , а затем используйте contains () :

Set<String> set = new HashSet<String> (Arrays.asList (stringArray));
while (!set.contains(line)) { ... }

[РЕДАКТИРОВАТЬ] Если вы хотите узнать, содержит ли часть строки строку из набора, вы должны перебрать набор. Замените set.contains (line) вызовом:

public boolean matches(Set<String> set, String line) {
    for (String check: set) {
        if (line.contains(check)) return true;
    }
    return false;
}

Отрегулируйте проверку соответствующим образом, когда вы используете регулярное выражение или более сложный метод сопоставления.

[EDIT2] Третий вариант - объединить элементы в массиве в огромное регулярное выражение с помощью | :

Pattern p = Pattern.compile("str1|str2|str3");

while (!p.matcher(line).find()) { // or matches for a whole-string match
    ...
}

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

3
ответ дан 14 December 2019 в 19:17
поделиться

Использование строки . match (regex) функция, как насчет создания регулярного выражения, которое соответствует любой из строк в массиве строк? Что-то вроде

String regex = "*(";
for(int i; i < array.length-1; ++i)
  regex += array[i] + "|";
regex += array[array.length] + ")*";
while( line.matches(regex) )
{
  //. . . 
}
0
ответ дан 14 December 2019 в 19:17
поделиться

Это зависит от того, что такое stringArray . Если это Коллекция , тогда хорошо. Если это настоящий массив, вы должны сделать его Коллекцией . Интерфейс Collection имеет метод под названием contains () , который определяет, находится ли данный Object в Collection .

Simple способ превратить массив в Collection :

String tokens[] = { ... }
List<String> list = Arrays.asList(tokens);

Проблема со списком List заключается в том, что поиск является дорогостоящим (технически линейным или O (n) ). Лучше использовать Set , который неупорядочен, но имеет почти постоянный ( O (1) ) поиск. Вы можете построить его так:

Из Коллекции :

Set<String> set = new HashSet<String>(stringList);

Из массива:

Set<String> set = new HashSet<String>(Arrays.asList(stringArray));

, а затем set.contains (line) будет дешевой операцией.

Редактировать: Хорошо, я думаю, ваш вопрос был непонятен. Вы хотите увидеть, содержит ли строка какое-либо из слов в массиве. Тогда вам нужно что-то вроде этого:

BufferedReader in = null;
Set<String> words = ... // construct this as per above
try {
  in = ...
  while ((String line = in.readLine()) != null) {
    for (String word : words) {
      if (line.contains(word)) [
        // do whatever
      }
    }
  }
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (in != null) { try { in.close(); } catch (Exception e) { } }
}

Это довольно грубая проверка, которая используется на удивление открыто и имеет тенденцию давать досадные ложные срабатывания при таких словах, как «лом». Для более сложного решения вам, вероятно, придется использовать регулярное выражение и искать границы слов:

Pattern p = Pattern.compile("(?<=\\b)" + word + "(?=\b)");
Matcher m = p.matcher(line);
if (m.find() {
  // word found
}

Возможно, вы захотите сделать это более эффективно (например, не компилировать шаблон с каждой строкой), но это основной инструмент, который нужно использовать.

] который используется на удивление открыто и имеет тенденцию давать досадные ложные срабатывания при таких словах, как «лом». Для более сложного решения вам, вероятно, придется использовать регулярное выражение и искать границы слов:

Pattern p = Pattern.compile("(?<=\\b)" + word + "(?=\b)");
Matcher m = p.matcher(line);
if (m.find() {
  // word found
}

Возможно, вы захотите сделать это более эффективно (например, не компилировать шаблон с каждой строкой), но это основной инструмент, который следует использовать.

который используется на удивление открыто и имеет тенденцию давать досадные ложные срабатывания при таких словах, как «лом». Для более сложного решения вам, вероятно, придется использовать регулярное выражение и искать границы слов:

Pattern p = Pattern.compile("(?<=\\b)" + word + "(?=\b)");
Matcher m = p.matcher(line);
if (m.find() {
  // word found
}

Возможно, вы захотите сделать это более эффективно (например, не компилировать шаблон с каждой строкой), но это основной инструмент, который следует использовать.

2
ответ дан 14 December 2019 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: