2013-12-16 3 views
1

Каков наиболее эффективный способ поиска одного элемента в ArrayList из ArrayLists? Учитывая следующее:Поиск ArrayList из ArrayLists

ArrayList<ArrayList<Integer>> intList = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> a = new ArrayList<>(); 
a.add(1); 
a.add(2); 
ArrayList<Integer> b = new ArrayList<>(); 
b.add(3); 
b.add(4); 
intList.add(a); 
intList.add(b); 

Как бы поиск, чтобы увидеть, если ArrayListintList содержит специфический Integer, как 3?

+0

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

+0

Является ли цикл достаточно полным для всего 2-мерного массива? – Haozhun

+0

[Идеи здесь] (http://stackoverflow.com/questions/3477442/algorithm-efficient-way-to-search-an-integer-in-a-two-dimensional-integer-array), вероятно, поможет –

ответ

4

Просто повторяет все списки и спрашивает, содержит ли какое-либо из них ваше значение.

public boolean contains(int x, ArrayList<ArrayList<Integer>> listOfLists) { 
    for (ArrayList list: listOfLists) { 
     if (list.contains(x)) return true; 
    } 
    return false; 
} 

Однако, я согласен с radai. Вероятно, существует потребность в более эффективной структуре данных, а не в эффективном алгоритме

+0

Спасибо. Я согласен, что могу сделать более эффективную структуру данных, но в крайнем случае это нормально. Не был уверен, была ли какая-то функция, о которой я не знал. –

+0

@Adam_G для общего случая, когда списки целых чисел не отсортированы, это лучшее, что вы можете сделать. Однако, если каждый «Список » заполняется монотонно увеличивающейся последовательностью, как показано в вашем примере, вы можете повысить производительность от O (n^2) до O (n log n). И если ни один из двух списков не имеет перекрывающихся диапазонов (опять же, как в вашем примере), вы можете улучшить свою эффективность поиска до O (log n). – rob

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