2015-09-05 5 views
-4

Я хочу найти наиболее эффективный/быстрый способ проверить, принадлежит ли строка массиву как в Java, так и в JavaScript.
Например, я хочу, чтобы найти, если строка "=" принадлежит в массиве {"+", "-", "=", "*", "/", "!"}Самый эффективный/более быстрый способ проверить, принадлежит ли строка массиву

способ сделать это в Яве (опуская основной метод)

String[] symbols = {"+", "-", "=", "*", "/", "!"}; 
String equalTo = "="; 
for(String i: symbols) { 
    if(equalTo.equals(i)) { 
    System.out.print(equalTo + " belongs to symbols."); 
    } 
} 

Я хотел бы знать, если есть один метод, который делает это для меня в Java или JavaScript.

Причина, по которой я спрашиваю об этом на обоих языках, заключается в том, что я хочу посмотреть, проще ли это на Java или JavaScript.

+0

Вы используете java 8? –

+3

Java и Javascript - это два совершенно разных языка, зачем вам нужно использовать один и тот же код для конкретной проблемы на разных языках? – Dici

+0

@ Dici Мне нужно это на обоих языках –

ответ

0

В Java вы можете использовать Arrays.asList(yourArray).contains(yourValue). Если вы используете jQuery, вы можете использовать $.inArray(yourValue, yourArray).

+0

У обеих функций возвращаются логические значения? –

+0

Дорого, чтобы создать список массивов для этого. Дорого, чтобы полагаться на библиотеку для этого – Dici

+0

Java содержит возврат boolean. inArray возвращает индекс значения в массиве (если он содержит, он должен быть больше -1). –

1

Ответы на ваш вопрос в JavaScript: How do I check if an array includes an object in JavaScript?

Э.Г. Если вы ищете для полного матча вы можете использовать:

["=", "+", "-"].indexOf("=") // => 1 
+0

Как насчет Java? –

+0

http://stackoverflow.com/questions/558978/most-efficient-way-to-see-if-an-arraylist-contains-an-object-in-java? – zmii

+0

@zmii a ArrayList не является массивом в Java. – bcsb1001

1

Наиболее эффективный способ увидеть, если строка находится в коллекции строк, когда эта коллекция уже хэшируются. Например, если у вас есть HashSet<String> на Java, вы можете просто использовать метод .contains(String), который работает в O (1).

Если ваша коллекция хранится как ArrayList<String> или массив, требуется время O (n), чтобы проверить, находится ли строка в коллекции (также с помощью метода .contains(String)).

Включение списка или массива в набор занимает время O (n), но занимает больше времени, чем проверка наличия одного элемента в списке.

Итак, в заключение:

  • Если вы хотите, чтобы проверить одного элемента, если он находится в коллекции, просто перебрать список, что вы по-видимому, уже есть, и проверить, если элемент находится в списке , Для массива в Java просто используйте Arrays.asList(symbols).contains(equalTo) и в JavaScript используйте symbols.contains(equalTo)
  • Если вы хотите проверить наличие большого количества элементов, независимо от того, находятся ли они в коллекции, то лучше сначала включить коллекцию в набор. В Java, сделать что-то вроде

    HashSet<String> set = new HashSet<String>(); 
    set.addAll(Arrays.asList(symbols)); 
    

    , после чего вы можете сделать set.contains(equalTo).

    Для JavaScript, это немного больше раздражает, но первая вещь с верхней части моей головы, как это:

    var set = Object.create(null); 
    for (var i in symbols) { 
        set[i] = true; 
    } 
    

    Затем вы можете проверить, если checkTo in set.

Извините за длинный ответ, но вы просили об эффективности правильно?

+1

Коллекция! = Массив. – bcsb1001

+0

Массив - это сборник (а не Java-мудрый, очевидно, поэтому я говорю коллекцию вместо Collection). – Infima

+0

Кроме того, инициализация 'set' не использует [' HashSet (Collection ) '] (http: // docs .oracle.com/JavaSE/7/документы/API/Java/Util/HashSet.html # HashSet (java.util.Collection)). Является ли этот конструктор плохой практикой? Тогда я не знаю, почему он там. – bcsb1001

0

«Лучший» способ сделать это действительно зависит от количества значений, которые соответствуют друг другу и как часто вам нужно это делать.

Если список длинный, и вы делаете это часто, вам лучше обслуживать создание массива set/map/associate-array для быстрого поиска или сортировки списка значений и выполнения двоичного поиска. В Java это будет Set<String> или Arrays.binarySearch().

Однако в вашем случае список короткий, поэтому последовательный поиск, как вы делаете, в порядке.

Но в дополнение к этому, ваши ценности все односимвольный, так что это решение, которое как раз случается быть точно такое же решение как для Java и JavaScript: indexOf()

В Java:

if ("+-=*/!".indexOf(value) != -1) { 
    // found 
} 

В JavaScript:

if ("+-=*/!".indexOf(value) != -1) { 
    // found 
} 

Жуткий, да?

Смежные вопросы