2016-04-07 2 views
0

Привет Я новичок в java и пытаюсь понять архаиста. Я использую Arraylist theList и dummyValues ​​. Я прочитал значения от theList и обновил значения поплавка в dummyValues ​​. Мой фрагмент кода выглядит следующим образом `Проверить и добавить значения float в arraylist

 public static void generateValues(ArrayList<Float> theList) { 

    for (int j = 0; j < theList.size(); j++) { 
     if (dummyValues.size()==0) 
       dummyValues.add(j, theList.get(j)); 

      else 
       dummyValues.set(j, theList.get(j)); 
        }  
} 

Я пытаюсь добавить значения в ArrayList dummyValues ​​ в первом состоянии и во втором состоянии, если размер dummyValues ​​ больше 0 просто обновить значение dummyValues ​​. Я рассмотрел этот метод, чтобы избежать дублирования копий.

Но, когда я исполняю его я получаю следующее сообщение об ошибке:

java.lang.IndexOutOfBoundsException: Invalid индекс 1, размер 1

Ошибка возникает здесь dummyValues.set(j, theList.get(j));

Я знаю, что это тривиальная концепция, всякая помощь приветствуется

+2

Вы уверены, что 'dummValues' и' theList' имеют одинаковый размер? иначе вы можете игнорировать значения или получить свое исключение. В этом конкретном случае кажется, что 'theList' больше, чем' dummyList'. – SomeJavaGuy

+0

'dummyValues' имеет только один элемент. Но вы вызываете set для индекса 1 и т. Д., Так как есть только один элемент, который вы можете установить только для индекса 0 –

+0

@FastSnail спасибо за информацию. Теперь я понимаю, что вы можете устанавливать только индексы, в которых есть элементы. Есть ли способ избежать дублирования элементов? – ADI

ответ

2

Я хотел бы предложить это улучшение. Измените метод следующим образом:

public static void generateValues(ArrayList<Float> theList) { 

for (int j = 0; j < theList.size(); j++) { 
    if (dummyValues.size()==0){ 
      dummyValues.add(j, theList.get(j)); 
     } 
     else if(dummyValues.size()==theList.size()){ 
      dummyValues.set(j, theList.get(j)); 
       }  
    else{ 
     dummyValues.add(theList.get(j)); 
    } 
} 

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

EDIT: Это неправильный ответ !!! Извините, я пишу быстрее, чем думал. :( Он работает только в том случае, если theList.size() > dummyValues.size(). Я постараюсь ответить на свой вопрос;)

EDIT2: Здравствуйте. Сделал некоторые работы, и я вернулся. Я переработал ваш метод и получил второе, на мой взгляд, лучшее решение для вас. Проверьте это:

public static void generateValues(List<Float> theList) { 

    if (dummyValues.size() >= theList.size()) { 
    for (float value : theList) { 
     dummyValues.set(theList.indexOf(value), value); 
    } 
    } 
    else { 
    for (float value : theList) { 
     dummyValues.add(dummyValues.size(), value); 
    } 
    } 
} 

Попробуйте и дайте мне знать, если это соответствует вашим потребностям.

0

Учтите, что если dummyList пуст, когда j равно 0, он добавляет к нему один элемент из theList, но когда j равно 1, вы пытаетесь установить элемент в позиции 1 из dummyList. Но в этот момент dummyList имеет только один элемент, который находится в позиции 0. Вот почему вы получаете ошибку.

Одно из решений для того, чтобы создать dummyList с начальной емкостью (или размера, если вы предпочитаете), как размер theList «s.

public static void generateValues(ArrayList<Float> theList) { 

for (int j = 0; j < theList.size(); j++) { 
    if (dummyValues.size()==0){ 
      dummyValues = new ArrayList<>(theList.size()); 
      dummyValues.add(j, theList.get(j)); 

     } else 
      dummyValues.set(j, theList.get(j)); 
    }  

}

0

Вы не учли тот факт, что если dummyValues имеет только 1 элемент, он пройдет dummyValues.size()==0), но будет иметь только индекс 0, так как ArrayList начнет отсчет с 0. Так что если мы находимся в индексе 1 из theList он бросит вам исключение, о котором идет речь.

Вы, возможно, придется добавить еще одно условие для dummyValues.size()==1) это все :)

0
  • Убедитесь, что переменные и инициализирован.

    dummyValues = new ArrayList<Float>(); 
    
  • Затем вы можете сделать эту проверку, прежде чем делать что-либо в коде -

    public void generateValues(ArrayList<Float> theList) { 
    
    if (theList.size() > 0) { 
        for (int j = 0; j < theList.size(); j++) { 
         if (dummyValues.size() == 0) { 
          dummyValues.add(theList.get(j)); 
         } else { 
          try { 
           if (dummyValues.get(j) != null) { 
            dummyValues.set(j, theList.get(j)); 
           } 
          } catch (IndexOutOfBoundsException e) { 
           //no element present here . 
          } 
         } 
    
        } 
        } 
    
    } 
    

Это будет проверять, если theList имеет какое-либо значение вообще, то начать цикл. если dummyValues пуст, добавьте 0-й элемент или замените dummyValues ​​на значения theList.

Дайте мне попробовать и дайте мне знать, если это сработает для вас.

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