Adam только частично прав. Многие, если вообще, математики никогда не будут касаться его. Если существует компьютерный инструмент, используемый вообще, это будет чем-то как Mathematica или Клен . Технические отделы, с другой стороны, часто полагаются на него и существуют определенно полезные вещи для некоторых прикладных математиков. Это также используется в большой степени в промышленности в некоторых областях.
Что-то, что необходимо понять о MATLAB, - то, что он начался как обертка на библиотеки Fortran для линейной алгебры. В течение долгого времени это имело отношение, из которого "весь мир является массивом, удваивается (плавает)". Как язык, это выросло очень органически, и существуют некоторые дефекты, которые очень испеклись в, если Вы смотрите на него так же, как на язык программирования.
Однако при рассмотрении его как среды для того, чтобы выполнить в определенных типах исследования это имеет некоторые реальные преимущества. Это почти столь хорошо, как это добирается для того, чтобы сделать линейную алгебру с плавающей точкой. Нотация проста и мощна, реализация быстро и доверяла. Это очень хорошо в генерации графиков и других интерактивных задач. Существует большое количество 'панелей инструментов' с хорошим кодом для конкретных задач, которые доступны. Существует многочисленное сообщество пользователей, которые совместно используют числовые коды (Python + , NumPy ничего не имеет в той же лиге, по крайней мере, еще)
, Python, бородавки и все, является намного лучшим языком программирования (как многие другие). Однако это - приблизительно одно десятилетие позади с точки зрения инструментов.
ключевой пункт - то, что большинство людей, которые используют MATLAB, не является программистами действительно и не хочет быть.
Это - паршивый выбор для общего языка программирования; это является изворотливым, медленным для многих задач (необходимо векторизовать вещи получить эффективные коды), и не легкий интегрироваться с внешним миром. С другой стороны, для вещей это способно, это очень очень хорошо. Очень немного вещей выдерживают сравнение. Существует компания с разумной поддержкой и кто знает, сколько годы человека помещали в него. Это может иметь значение в промышленности.
Строго рассмотрение Вашего Python по сравнению со сравнением MATLAB, они - главным образом различные инструменты для различных заданий. В областях, где они действительно накладываются немного, трудно сказать, что лучший маршрут пойти (во многом зависит от того, что Вы пытаетесь сделать). Но главным образом Python не весь настолько хорош в базовых преимуществах MATLAB, и наоборот.
Скопируйте все значения в 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
...
}
Это может быть дешевле, если у вас много элементов в массиве, поскольку код регулярного выражения оптимизирует процесс сопоставления.
Использование строки . match (regex)
функция, как насчет создания регулярного выражения, которое соответствует любой из строк в массиве строк? Что-то вроде
String regex = "*(";
for(int i; i < array.length-1; ++i)
regex += array[i] + "|";
regex += array[array.length] + ")*";
while( line.matches(regex) )
{
//. . .
}
Это зависит от того, что такое 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
}
Возможно, вы захотите сделать это более эффективно (например, не компилировать шаблон с каждой строкой), но это основной инструмент, который следует использовать.