2012-01-02 4 views
0

Как я могу найти объект в векторе, который содержит наибольшее количество элементов? Например:Найти объект в векторе, который содержит наибольшее количество элементов

int[] val1 = {1,2,3}; 
int[] val2 = {1}; 
int[] val3 = {1,2}; 
Vector<Object> d = new Vector<Object>(); // update 
c.add(val1); 
c.add(val2); 
c.add(val3); 
int answ = findBiggest(c); 

В этом примере, answ должен быть равен 0, так как val1 содержит 3 числа.

+0

Целое! = Int [] ....... вы получаете ошибки компилятора !!! –

+1

Что вы пробовали? У вас есть проблемы с сравнением чисел или получением размера вектора или определения классов и методов? –

+0

В вашем примере кода возникают ошибки компилятора. Вектор c принимает только Integer, а не int [] .. даже автобоксинг не поможет с этим – AlanFoster

ответ

1

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

Я также изменил общий тип для Integer [] тоже. Потому что я считаю, что есть накладные расходы, связанные с autoboxing, который, как я полагаю, минимален, но хорошая практика? (Кто-нибудь может подтвердить это?)

public static void main(String[] args) { 
    Integer[] val1 = {1,2,3}; 
    Integer[] val2 = {1,2,3,3,3}; 
    Integer[] val3 = {1,2}; 
    ArrayList<Integer[]> c = new ArrayList<Integer[]>(); 
    c.add(val1); 
    c.add(val2); 
    c.add(val3); 
    int answ = findBiggest(c); 
    System.out.println(answ); 
} 

public static int findBiggest(ArrayList<Integer[]> list){ 
    int biggestSize = 0 
    int biggestPos = -1; 
    int i = 0; 
    for(Integer[] el : list){ 
     if(el.length >= biggestSize){ 
      biggestSize = el.length; 
      biggestPos = i; 
     } 
     i++; 
    } 

    return biggestPos; 
} 
+0

Накладные расходы на автообновление увеличивают память, используемую для целого числа, как минимум 3 раза и требуют распределения кучи. Не проблема, если вы имеете дело с несколькими сотнями. Огромная проблема, если это миллионы, или код, который с ними связан, критически важны, а autoboxed ints вызывает постоянные промахи кэшей. –

1
  • Прежде всего, Vector является устаревшим классом, который больше не должен использоваться. Если вы сами выбрали свой учебный материал, бросьте его и найдите что-то более современное. Скажите им, что это домашняя работа, данная учителем.
  • Ваш код не будет компилироваться, потому что вы не можете добавить int[] к Vector<Integer>
  • Вы можете цикл по элементам коллекции с помощью расширенной цикл:

    for(int[] element : collection){ /* Do something with element */ }

  • Количество элементов массива находится через поле length массива.
+0

Почему вектор устарел? Что вы предлагаете в качестве лучшей коллекции для использования? –

+0

@JJ Liu: ArrayList (введенный более 10 лет назад в Java 1.2) должен использоваться вместо этого.Вектор синхронизируется, что делает его более медленным и почти всегда бесполезным, и его API загрязнен методами, находящимися до рамки коллекций, функциональность которых дублируется методами из интерфейса List. –

+0

Спасибо. ArrayList, Array, List, какой из них вы бы предложили использовать в конкретной ситуации? –

1

Прежде всего следует отметить, что ваш Vector не типизирован (должен быть Vector<int[]>) Следующая вот быстрый способ

public int findBiggest(Vector<int[]> c) { 
    int max = -1; 
    int ok = -1; 
    int index = 0; 
    for (int[] ints : c) { 
     if (max < ints.length) { 
      max = ints.length; 
      ok = index; 
     } 
     index ++; 
    } 
    return ok; 
} 

public void test() { 
    int[] val1 = {1,2,3}; 
    int[] val2 = {1}; 
    int[] val3 = {1,2}; 
    Vector<int[]> c = new Vector<int[]>(); 
    c.add(val1); 
    c.add(val2); 
    c.add(val3); 
    int answ = findBiggest(c); 
} 

И как michael-borgwardt сказал, не используйте Vector по этой причине : Vector Obsolete. Вкратце, это связано с проблемой синхронизации. Поэтому используйте абстракцию List с ее общей реализацией ArrayList. Вы также можете использовать Collection (поскольку индекс здесь не кажется важным), а не List.

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