Как изменить элемент списка java

Please help me with below code , I get the same output even after changing the value import java.util.*; class Test { public static void main(String[] args) { ArrayList...

The list is maintaining an object reference to the original value stored in the list. So when you execute this line:

Integer x = i.next();

Both x and the list are storing a reference to the same object. However, when you execute:

x = Integer.valueOf(9);

nothing has changed in the list, but x is now storing a reference to a different object. The list has not changed. You need to use some of the list manipulation methods, such as

list.set(index, Integer.valueof(9))

Note: this has nothing to do with the immutability of Integer, as others are suggesting. This is just basic Java object reference behaviour.


Here’s a complete example, to help explain the point. Note that this makes use of the ListIterator class, which supports removing/setting items mid-iteration:

import java.util.*;

public class ListExample {

  public static void main(String[] args) {

    List<Foo> fooList = new ArrayList<Foo>();
    for (int i = 0; i < 9; i++)
      fooList.add(new Foo(i, i));

    // Standard iterator sufficient for altering elements
    Iterator<Foo> iterator = fooList.iterator();

    if (iterator.hasNext()) {
      Foo foo = iterator.next();
      foo.x = 99;
      foo.y = 42;
    }

    printList(fooList);    

    // List iterator needed for replacing elements
    ListIterator<Foo> listIterator = fooList.listIterator();

    if (listIterator.hasNext()) {
      // Need to call next, before set.
      listIterator.next();
      // Replace item returned from next()
      listIterator.set(new Foo(99,99));
    }

    printList(fooList);
  }

  private static void printList(List<?> list) {
    Iterator<?> iterator = list.iterator();
    while (iterator.hasNext()) {
      System.out.print(iterator.next());
    }
    System.out.println();
  }

  private static class Foo {
    int x;
    int y;

    Foo(int x, int y) {
      this.x = x;
      this.y = y;
    }

    @Override
    public String toString() {
      return String.format("[%d, %d]", x, y);
    }
  }
}

This will print:

[99, 42][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]
[99, 99][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]


Содержание

  • 1. Метод add(). Добавить элемент в конец массива
  • 2. Метод addAll(). Добавить коллекцию к массиву
  • 3. Метод clear(). Очистить массив
  • 4. Метод remove(). Удалить элемент в указанной позиции
  • 5. Метод removeAll(). Удалить группу элементов из коллекции
  • 6. Метод removeIf(). Изменить коллекцию на основе предиката
  • 7. Метод replaceAll(). Произвести вычисления над каждым элементом массива
  • 8. Метод set(). Установить новое значение в элементе
  • 9. Метод sort(). Отсортировать элементы массива
  • Связанные темы

Поиск на других ресурсах:

1. Метод add(). Добавить элемент в конец массива

Метод add() добавляет элемент в массив. Метод имеет две перегруженные реализации

add(E obj)
add(int index, E obj)

здесь

  • E – тип элементов массива;
  • obj – объект (элемент), добавляемый к массиву;
  • index – позиция, в которую нужно вставить элемент obj в массив.

Пример. В примере формируется массив квадратов чисел от 1 до 10. Для добавления числа в конец массива используется метод add().

import java.util.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод addAll() - добавить элемент в конец массива
    // 1. Создать массив из чисел типа Integer
    ArrayList<Integer> AI = new ArrayList();

    // 2. Добавить в массив квадраты чисел от 1 до 10
    for (int i=1; i<=10; i++)
      AI.add(i*i);

    // 3. Вывести массив
    System.out.println(AI);

    // 4. Добавить число 555 на начало массива в позицию 0
    AI.add(0, 555);
    System.out.println(AI);
  }
}

Результат выполнения программы

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[555, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

2. Метод addAll(). Добавить коллекцию к массиву

Метод addAll() предназначен для добавления уже существующей коллекции в массив. Коллекцией могут быть коллекция, очередь, другой массив и т.д. Метод имеет две перегруженные реализации

addAll(Collection<? extends E>)
addAll(int index, Collection<? extends E>)

здесь

  • E – тип элементов массива (коллекции);
  • index – позиция, с которой происходит вставка.

Пример. Демонстрируется использование метода addAll() для массива целых чисел.

import java.util.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод addAll() - добавить коллекцию к массиву
    // 1. Создать массив из 5 чисел типа Float
    ArrayList<Float> AI = new ArrayList();
    AI.add(1.0f);
    AI.add(2.0f);
    AI.add(3.0f);
    AI.add(4.0f);
    AI.add(5.0f);
    System.out.println("AI = " + AI);

    // 2. Создать другой массив из 3 чисел типа Float
    ArrayList<Float> AI2 = new ArrayList();
    for (int i=1; i<=3; i++)
      AI2.add(i*15f);
    System.out.println("AI2 = " + AI2);

    // 3. Добавить массив AI2 в конец массива AI
    AI.addAll(AI2);
    System.out.println("AI + AI2 = " + AI);

    // 4. Записать массив AI2 в массив AI начиная с позиции 2
    AI.addAll(2, AI2);
    System.out.println("AI[2] + AI2 = " + AI);
  }
}

Результат выполнения программы

AI = [1.0, 2.0, 3.0, 4.0, 5.0]
AI2 = [15.0, 30.0, 45.0]
AI + AI2 = [1.0, 2.0, 3.0, 4.0, 5.0, 15.0, 30.0, 45.0]
AI[2] + AI2 = [1.0, 2.0, 15.0, 30.0, 45.0, 3.0, 4.0, 5.0, 15.0, 30.0, 45.0]

 

3. Метод clear(). Очистить массив

Метод clear() предназначен для очищения массива. Согласно документации общая форма объявления метода следующая

public void clear();

Пример. В примере создается коллекция из символов-разделителей.

import java.util.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод clear() - очистить коллекцию
    // 1. Создать коллекцию из разделительных символов в предложении
    ArrayList<Character> AL = new ArrayList();
    AL.add(';');
    AL.add(':');
    AL.add(',');
    AL.add('.');
    AL.add('!');
    AL.add('?');
    AL.add(' ');

    // 2. Вывести коллекцию
    System.out.println("AL => " + AL);

    // 3. Очистить коллекцию
    AL.clear();

    // 4. Вывести коллекцию после очистки
    System.out.println("AL.clear() => " + AL);
  }
}

Результат выполнения программы

AL => [;, :, ,, ., !, ?,  ]
AL.clear() => []

 

4. Метод remove(). Удалить элемент в указанной позиции

С помощью метода remove() можно удалить элемент в заданной позиции. Согласно документации, объявление метода следующее

public E remove(int index);

здесь

  • E – тип элементов массива (коллекции);
  • index – номер позиции, которую нужно удалить. Позиция нумеруется с 0.

Метод возвращает значение удаляемого элемента из массива (коллекции).

Если значение index указано за пределами допустимого диапазона

(index < 0 || index >= size())

то будет сгенерировано исключение IndexOutOfBoundsException.

Пример.

import java.util.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод remove() - удалить отдельный элемент из массива
    // 1. Создать коллекцию вещественных чисел
    ArrayList<Float> AL = new ArrayList<Float>();
    AL.add(2.8f);
    AL.add(3.5f);
    AL.add(7.2f);
    AL.add(9.4f);
    AL.add(5.2f);

    // 2. Вывести коллекцию
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
    System.out.println();

    // 3. Удалить элемент в позиции 2, который имеет значение 7.2
    AL.remove(2);

    // 4. Вывести измененную коллекцию
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
  }
}

Результат выполнения программы

AL => 2.8  3.5  7.2  9.4  5.2
AL => 2.8  3.5  9.4  5.2

 

5. Метод removeAll(). Удалить группу элементов из коллекции

С помощью метода removeAll() можно удалить несколько элементов, представленных в виде коллекции. Согласно документации объявление метода следующее:

public boolean removeAll(Collection<?> c);

здесь

  • c – коллекция (массив) элементов, которые нужно удалить из текущей коллекции.

Метод возвращает true, если текущий массив изменился в результате вызова.

Пример.

В примере формируются две целочисленные коллекции:

  • AL – исходная коллекция чисел;
  • AL2 – коллекция чисел, которые необходимо удалить из коллекции AL.

С помощью метода removeAll() происходит удаление из коллекции AL всех частей, входящих в коллекцию AL2.

import java.util.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод removeAll() - удалить группу элементов из массива
    // 1. Создать коллекцию целых чисел
    ArrayList<Integer> AL = new ArrayList<Integer>();
    AL.add(2);
    AL.add(3);
    AL.add(2);
    AL.add(4);
    AL.add(7);
    AL.add(3);
    AL.add(4);
    AL.add(5);
    AL.add(6);
    AL.add(1);

    // 2. Вывести исходную коллекцию
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
    System.out.println();

    // 3. Создать коллекцию чисел, которые нужно удалить
    ArrayList<Integer> AL2 = new ArrayList<Integer>();

    // удалить все числа 2, 4, 7
    AL2.add(2);
    AL2.add(4);
    AL2.add(7);

    // 4. Вызвать метод removeAll()
    AL.removeAll(AL2);

    // 4. Вывести измененную коллекцию
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
  }
}

Результат выполнения программы

AL => 2  3  2  4  7  3  4  5  6  1
AL => 3  3  5  6  1

 

6. Метод removeIf(). Изменить коллекцию на основе предиката

С помощью метода removeIf() можно удалить элементы из коллекции согласно условию. В результате формируется новая коллекция (массив). Общая форма объявления метода следующая

public boolean removeIf(Predicate<? super E> filter);

здесь

  • filter – ссылка (предикат), определяющее условие фильтрования. Условие задается лямбда-выражением.

Метод возвращает true, если хотя бы один элемент был удалён.

Пример.

В примере демонстрируется выполнение метода removeIf(). Демонстрируются следующие операции:

  • создается коллекция целых чисел;
  • формируется предикат, в котором определяются числа, которые больше 4;
  • вызывается метод removeIf(), с помощью которого формируется новый массив чисел согласно предикату.
import java.util.*;
import java.util.function.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод removeIf() - изменить массив по заданному условию
    // 1. Создать коллекцию целых чисел
    ArrayList<Integer> AL = new ArrayList<Integer>();
    AL.add(2);
    AL.add(3);
    AL.add(2);
    AL.add(4);
    AL.add(7);
    AL.add(3);
    AL.add(4);
    AL.add(5);
    AL.add(6);
    AL.add(1);

    // 2. Вывести исходную коллекцию
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
    System.out.println();

    // 3. Объявить ссылку на интерфейс Predicate<Integer>
    Predicate<Integer> ref;

    // 4. Сформировать условие для ссылки ref на основе лямбда-выражения:
    //    взять все числа, которые больше 4
    ref = (value) -> value > 4;

    // 5. Вызвать метод removeIf() и передать ему ссылку ref условием
    AL.removeIf(ref);    // удалить все числа, которые больше 4

    // 6. Вывести измененный массив AL
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
    System.out.println();
  }
}

Результат выполнения программы

AL => 2  3  2  4  7  3  4  5  6  1
AL => 2  3  2  4  3  4  1

 

7. Метод replaceAll(). Произвести вычисления над каждым элементом массива

С помощью метода replaceAll() можно применить некоторую операцию к каждому элементу массива. Такой операцией может быть, например произведение каждого элемента на 2. Согласно документации, общая форма объявления метода следующая:

public void replaceAll(UnaryOperator<E> operator);

здесь

  • operator – лямбда-выражение, определяющее операцию над каждым элементом последовательности. Лямбда-выражение формируется с помощью функционального интерфейса UnaryOperator<T>.

Пример. В примере создается массив целых чисел. Затем каждый элемент массива умножается на 3 с помощью метода replaceAll(). Для выполнения вычисления формируется ссылка на подходящее лямбда-выражение.

import java.util.*;
import java.util.function.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод replaceAll() - изменить значение элементов исходного массива
    // 1. Создать коллекцию целых чисел
    ArrayList<Integer> AL = new ArrayList<Integer>();
    AL.add(2);
    AL.add(3);
    AL.add(2);
    AL.add(4);
    AL.add(7);
    AL.add(3);

    // 2. Вывести коллекцию с помощью итератора
    Iterator<Integer> it = AL.iterator();
    System.out.print("AL => ");
    while (it.hasNext())
      System.out.print(it.next()+"  ");
    System.out.println();

    // 3. Сформировать лямбда-выражение, которое умножает элемент на 3
    UnaryOperator<Integer> op = (num) -> num*3;

    // 4. Вызвать метод replaceAll() и применить к нему оператор op
    AL.replaceAll(op);

    // 5. Вывести измененную коллекцию (массив) целых чисел
    it = AL.iterator();
    System.out.print("AL => ");

    while (it.hasNext()) {
      System.out.print(it.next() + "  ");
    }
  }
}

Результат выполнения программы

AL => 2  3  2  4  7  3
AL => 6  9  6  12  21  9

 

8. Метод set(). Установить новое значение в элементе

Метод set() устанавливает новое значение в заданной позиции массива. Другими словами, старое значение массива в заданной позиции заменяется новым. Объявление метода имеет вид

public E set(int index, E element);

здесь

  • index – позиция вставки (нумеруется с 0);
  • element – новое значение, которое необходимо установить в позиции index.

Метод возвращает предыдущее значение, установленное в заданной позиции.

Если значение index выходит за пределы допустимого диапазона, т.е.

(index < 0 || index >= size())

то будет сгенерировано исключение IndexOutOfBoundsException.

Приклад.

import java.util.*;
import java.util.function.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод set() - установить значение в отдельном элементе массива
    // 1. Создать коллекцию строк
    ArrayList<String> AL = new ArrayList<String>();
    AL.add("a");
    AL.add("b");
    AL.add("c");

    // 2. Вывести исходный массив с помощью итератора
    Iterator<String> it = AL.iterator();
    System.out.print("AL => ");
    while (it.hasNext())
      System.out.print(it.next()+"  ");
    System.out.println();

    // 3. Установить новое значение в элементе с индексом 1
    String oldValue;
    oldValue = AL.set(1, "bbb");

    // 4. Вывести предыдущую строку
    System.out.println("oldValue = " + oldValue);

    // 5. Вывести измененный массив
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
    System.out.println();
  }
}

Результат выполнения программы

AL => a  b  c
oldValue = b
AL => a  bbb  c

 

9. Метод sort(). Отсортировать элементы массива

С помощью метода sort() можно сортировать элементы массива. Общая форма объявления метода следующая

public void sort(Comparator<? super E> c);

здесь

  • c – компаратор (условие), реализующий принцип сравнения каких-либо двух элементов массива. Компаратор используется в случае разработки собственного класса, объекты которого могут быть отсортированы по некоторому критерию. В этом случае класс должен реализовать интерфейс Comparator. В этом интерфейсе определен метод compare(), сравнивающий два элемента. Конкретно этот способ нужно переопределить и воплотить в этом классе и задать свой механизм сравнения.

Для стандартных типов-оболочек (Integer, Double, String и т.д.) реализован внутренний компаратор, сортирующий элементы в естественном порядке (от меньшего к большему или по алфавиту).

Для использования стандартного способа сортировки следует вызвать метод sort() с аргументом null

AL.sort(null);

здесь AL – массив сортируемых элементов.

Пример.

import java.util.*;
import java.util.function.*;

public class TrainCollections {

  public static void main(String[] args) {
    // Метод sort() - сортировка в естественном порядке
    // 1. Создать массив строк
    ArrayList<String> AL = new ArrayList<String>();
    AL.add("jklm");
    AL.add("abcd");
    AL.add("elsd");
    AL.add("lkls");
    AL.add("azsd");

    // 2. Вывести исходный массив
    Iterator<String> it = AL.iterator();
    System.out.print("AL => ");
    while (it.hasNext())
      System.out.print(it.next()+"  ");
    System.out.println();

    // 3. Отсортировать элементы массива, метод sort()
    AL.sort(null);

    // 4. Вывести отсортированный массив
    System.out.print("AL => ");
    for (int i=0; i<AL.size(); i++)
      System.out.print(AL.get(i) + "  ");
    System.out.println();
  }
}

Результат выполнения программы

AL => jklm  abcd  elsd  lkls  azsd
AL => abcd  azsd  elsd  jklm  lkls

 


Связанные темы

  • Класс ArrayList. Динамический массив. Общие сведения. Создание массива
  • Методы, определяющие информацию об элементах массива. Методы get(), contains(), containsAll(), indexOf(), lastIndexOf(), iterator(), listIterator()
  • Методы определяющие общие характеристики массива. Методы ensureCapacity(), isEmpty(), size(), trimToSize() 
  • Методы преобразующие массив в целом. Методы clone(), sublist(), toArray(), retainAll()

 


Disclosure: This article may contain affiliate links. When you purchase, we may earn a commission.

You can use the set() method of java.util.ArrayList class to replace an existing element of ArrayList in Java. The set(int index, E element) method takes two parameters, the first is the index of an element you want to replace, and the second is the new value you want to insert. You can use this method as long as your ArrayList is not immutable, I mean,  not created using the Collections.unmodifiableList(), in such case the set() method throws java.lang.UnsupportedOperationExcepiton

Though you can also use the set() method with the List returned by Arrays.asList() method as oppose to add() and remove() which is not supported there. You just need to be careful with the index of elements. For example, if you want to replace the first element then you need to call set(0, newValue) because similar to an array, the ArrayList index is also zero-based.

Now, the questions come why do you want to replace an element in the ArrayList? Why not just remove the element and insert a new one? Well, obviously the remove and insert will take more time than replace. 

The java.util.ArrayList provides O(1) time performance for replacement, similar to size(), isEmpty(), get()iterator(), and listIterator() operations which runs in constant time.

Now, you may wonder that why set() gives O(1) performance but add() gives O(n) performance, because it could trigger resizing of the array, which involves creating a new array and copying elements from the old array to the new array.  You can also see these free Java courses to learn more about the implementation and working of ArrayList in Java.

Replacing an existing object in ArrayList

Here is an example of replacing an existing value from ArrayList in Java. In this example, I have an ArrayList of String which contains names of some of the most popular and useful books for Java programmers. 

Our example replaces the 2nd element of the ArrayList by calling the ArrayList.set(1, «Introduction to Algorithms») because the index of the array starts from zero. You should read a comprehensive course like The Complete Java Masterclass on Udemy to learn more about useful collection classes in Java, including ArrayList.

How to replace an element of ArrayList in Java? Example

Java Program to replace elements in ArrayList

import java.util.ArrayList;
import java.util.List;

/*
 * Java Program to demonstrate how to replace existing value in 
 * ArrayList.
 */

public class ArrayListSetDemo {

  public static void main(String[] args) {

    // let's create a list first
    List<String> top5Books = new ArrayList<String>();
    top5Books.add("Clean Code");
    top5Books.add("Clean Coder");
    top5Books.add("Effective Java");
    top5Books.add("Head First Java");
    top5Books.add("Head First Design patterns");

    // now, suppose you want to replace "Clean Coder" with
    // "Introduction to Algorithms"
    System.out.println("ArrayList before replace: " + top5Books);

    top5Books.set(1, "Introductoin to Algorithms");

    System.out.println("ArrayList after replace: " + top5Books);
  }

}

Output
ArrayList before replace: [Clean Code, Clean Coder, Effective Java, 
Head First Java, Head First Design patterns]
ArrayList after replace: [Clean Code, Introduction to Algorithms, 
Effective Java, Head First Java, Head First Design patterns]

You can see that initially, we have a list of 5 books and we have replaced the second element by calling the set(1, value) method, hence in the output, the second book which was «Clean Coder» was replaced by «Introduction to Algorithms».

That’s all about how to replace existing elements of ArrayList in Java. The set() method is perfect to replace existing values just make sure that the List you are using is not immutable. You can also use this method with any other List type like LinkedList. The time complexity is O(n) because we are doing index-based access to the element.

Other ArrayList tutorials for Java Programmers

  • How to reverse an ArrayList in Java? (example)
  • How to loop through an ArrayList in Java? (tutorial)
  • How to synchronize an ArrayList in Java? (read)
  • How to create and initialize ArrayList in the same line? (example)
  • Difference between an Array and ArrayList in Java? (answer)
  • When to use ArrayList over LinkedList in Java? (answer)
  • Difference between ArrayList and Vector in Java? (answer)
  • How to get a sublist from ArrayList in Java? (example)
  • How to remove duplicate elements from ArrayList in Java? (tutorial)
  • How to sort an ArrayList in descending order in Java? (read)
  • Difference between ArrayList and HashSet in Java? (answer)
  • Difference between ArrayList and HashMap in Java? (answer)

Thanks for reading this tutorial so far. If you like this ArrayList replace example then please share it with your friends and colleagues. If you have any questions or feedback, please drop a note. 

Понравилась статья? Поделить с друзьями:
  • Как изменить элемент массива python
  • Как изменить элемент кода страницы на телефоне
  • Как изменить электропотребление виндовс 10
  • Как изменить электропитание на высокую производительность windows 11
  • Как изменить электроотрицательность