Как найти последний элемент массива джава

Ответы

Аватар пользователя Maksim Litvinov

Узнать последний элемент массива можно, обратившись к нему по индексу. Так как индексация элементов в массиве начинается с нуля, индекс последнего элемента массива на единицу меньше его длинны. Можно воспользоваться этим:

String[] fruits = {"apple", "lemon", "orange", "pear"};

var lastElement = fruits[fruits.length - 1];

System.out.println(lastElement); // => "pear"



0



0

Добавьте ваш ответ

Рекомендуемые курсы

11 часов

Старт в любое время

69 часов

Старт в любое время

14 часов

Старт в любое время

Похожие вопросы

How can I get the last value of an ArrayList?

Sambhav Khandelwal's user avatar

asked Mar 26, 2009 at 22:38

Jessy's user avatar

10

The following is part of the List interface (which ArrayList implements):

E e = list.get(list.size() - 1);

E is the element type. If the list is empty, get throws an IndexOutOfBoundsException. You can find the whole API documentation here.

Jarvis's user avatar

Jarvis

8,4243 gold badges27 silver badges57 bronze badges

answered Mar 26, 2009 at 22:42

Johannes Schaub - litb's user avatar

12

There isn’t an elegant way in vanilla Java.

Google Guava

The Google Guava library is great – check out their Iterables class. This method will throw a NoSuchElementException if the list is empty, as opposed to an IndexOutOfBoundsException, as with the typical size()-1 approach – I find a NoSuchElementException much nicer, or the ability to specify a default:

lastElement = Iterables.getLast(iterableList);

You can also provide a default value if the list is empty, instead of an exception:

lastElement = Iterables.getLast(iterableList, null);

or, if you’re using Options:

lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);

Olivier Grégoire's user avatar

answered Dec 28, 2012 at 16:16

Antony Stubbs's user avatar

Antony StubbsAntony Stubbs

13.1k5 gold badges35 silver badges39 bronze badges

4

this should do it:

if (arrayList != null && !arrayList.isEmpty()) {
  T item = arrayList.get(arrayList.size()-1);
}

Christian's user avatar

Christian

22.5k9 gold badges79 silver badges106 bronze badges

answered Mar 26, 2009 at 22:41

Henrik Paul's user avatar

Henrik PaulHenrik Paul

66.7k31 gold badges84 silver badges96 bronze badges

5

I use micro-util class for getting last (and first) element of list:

public final class Lists {

    private Lists() {
    }

    public static <T> T getFirst(List<T> list) {
        return list != null && !list.isEmpty() ? list.get(0) : null;
    }

    public static <T> T getLast(List<T> list) {
        return list != null && !list.isEmpty() ? list.get(list.size() - 1) : null;
    }
}

Slightly more flexible:

import java.util.List;

/**
 * Convenience class that provides a clearer API for obtaining list elements.
 */
public final class Lists {

  private Lists() {
  }

  /**
   * Returns the first item in the given list, or null if not found.
   *
   * @param <T> The generic list type.
   * @param list The list that may have a first item.
   *
   * @return null if the list is null or there is no first item.
   */
  public static <T> T getFirst( final List<T> list ) {
    return getFirst( list, null );
  }

  /**
   * Returns the last item in the given list, or null if not found.
   *
   * @param <T> The generic list type.
   * @param list The list that may have a last item.
   *
   * @return null if the list is null or there is no last item.
   */
  public static <T> T getLast( final List<T> list ) {
    return getLast( list, null );
  }

  /**
   * Returns the first item in the given list, or t if not found.
   *
   * @param <T> The generic list type.
   * @param list The list that may have a first item.
   * @param t The default return value.
   *
   * @return null if the list is null or there is no first item.
   */
  public static <T> T getFirst( final List<T> list, final T t ) {
    return isEmpty( list ) ? t : list.get( 0 );
  }

  /**
   * Returns the last item in the given list, or t if not found.
   *
   * @param <T> The generic list type.
   * @param list The list that may have a last item.
   * @param t The default return value.
   *
   * @return null if the list is null or there is no last item.
   */
  public static <T> T getLast( final List<T> list, final T t ) {
    return isEmpty( list ) ? t : list.get( list.size() - 1 );
  }

  /**
   * Returns true if the given list is null or empty.
   *
   * @param <T> The generic list type.
   * @param list The list that has a last item.
   *
   * @return true The list is empty.
   */
  public static <T> boolean isEmpty( final List<T> list ) {
    return list == null || list.isEmpty();
  }
}

Dave Jarvis's user avatar

Dave Jarvis

30.2k40 gold badges178 silver badges313 bronze badges

answered Oct 10, 2014 at 14:49

user11153's user avatar

user11153user11153

8,4265 gold badges47 silver badges49 bronze badges

5

The size() method returns the number of elements in the ArrayList. The index values of the elements are 0 through (size()-1), so you would use myArrayList.get(myArrayList.size()-1) to retrieve the last element.

answered Mar 26, 2009 at 22:44

Ken Paul's user avatar

Ken PaulKen Paul

5,6552 gold badges30 silver badges33 bronze badges

There is no elegant way of getting the last element of a list in Java (compared to e.g. items[-1] in Python).

You have to use list.get(list.size()-1).

When working with lists obtained by complicated method calls, the workaround lies in temporary variable:

List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);

This is the only option to avoid ugly and often expensive or even not working version:

return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
    someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);

It would be nice if fix for this design flaw was introduced to Java API.

answered Jun 5, 2019 at 21:20

Tregoreg's user avatar

TregoregTregoreg

18.3k14 gold badges48 silver badges69 bronze badges

4

Using lambdas:

Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);

answered May 8, 2018 at 1:18

Luis Vieira Damiani's user avatar

If you can, swap out the ArrayList for an ArrayDeque, which has convenient methods like removeLast.

answered Dec 12, 2014 at 20:49

John Glassmyer's user avatar

2

If you use a LinkedList instead , you can access the first element and the last one with just getFirst() and getLast() (if you want a cleaner way than size() -1 and get(0))

Implementation

Declare a LinkedList

LinkedList<Object> mLinkedList = new LinkedList<>();

Then this are the methods you can use to get what you want, in this case we are talking about FIRST and LAST element of a list

/**
     * Returns the first element in this list.
     *
     * @return the first element in this list
     * @throws NoSuchElementException if this list is empty
     */
    public E getFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return f.item;
    }

    /**
     * Returns the last element in this list.
     *
     * @return the last element in this list
     * @throws NoSuchElementException if this list is empty
     */
    public E getLast() {
        final Node<E> l = last;
        if (l == null)
            throw new NoSuchElementException();
        return l.item;
    }

    /**
     * Removes and returns the first element from this list.
     *
     * @return the first element from this list
     * @throws NoSuchElementException if this list is empty
     */
    public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }

    /**
     * Removes and returns the last element from this list.
     *
     * @return the last element from this list
     * @throws NoSuchElementException if this list is empty
     */
    public E removeLast() {
        final Node<E> l = last;
        if (l == null)
            throw new NoSuchElementException();
        return unlinkLast(l);
    }

    /**
     * Inserts the specified element at the beginning of this list.
     *
     * @param e the element to add
     */
    public void addFirst(E e) {
        linkFirst(e);
    }

    /**
     * Appends the specified element to the end of this list.
     *
     * <p>This method is equivalent to {@link #add}.
     *
     * @param e the element to add
     */
    public void addLast(E e) {
        linkLast(e);
    }

So , then you can use

mLinkedList.getLast(); 

to get the last element of the list.

answered Nov 11, 2018 at 23:10

Gastón Saillén's user avatar

Gastón SaillénGastón Saillén

12k5 gold badges64 silver badges75 bronze badges

1

As stated in the solution, if the List is empty then an IndexOutOfBoundsException is thrown. A better solution is to use the Optional type:

public class ListUtils {
    public static <T> Optional<T> last(List<T> list) {
        return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
    }
}

As you’d expect, the last element of the list is returned as an Optional:

var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;

It also deals gracefully with empty lists as well:

var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;

answered Apr 9, 2019 at 13:07

Colin Breame's user avatar

Colin BreameColin Breame

1,3472 gold badges15 silver badges18 bronze badges

A one liner that takes into account empty lists would be:

T lastItem = list.size() == 0 ? null : list.get(list.size() - 1);

Or if you don’t like null values (and performance isn’t an issue):

Optional<T> lastItem = list.stream().reduce((first, second) -> second);

answered Jan 2, 2021 at 7:58

Craigo's user avatar

CraigoCraigo

3,32429 silver badges22 bronze badges

In case you have a Spring project, you can also use the CollectionUtils.lastElement from Spring (javadoc), so you don’t need to add an extra dependency like Google Guava.

It is null-safe so if you pass null, you will simply receive null in return. Be careful when handling the response though.

Here are somes unit test to demonstrate them:

@Test
void lastElementOfList() {
    var names = List.of("John", "Jane");

    var lastName = CollectionUtils.lastElement(names);

    then(lastName)
        .as("Expected Jane to be the last name in the list")
        .isEqualTo("Jane");
}

@Test
void lastElementOfSet() {
    var names = new TreeSet<>(Set.of("Jane", "John", "James"));

    var lastName = CollectionUtils.lastElement(names);

    then(lastName)
        .as("Expected John to be the last name in the list")
        .isEqualTo("John");
}

Note: org.assertj.core.api.BDDAssertions#then(java.lang.String) is used for assertions.

Jacob van Lingen's user avatar

answered Aug 21, 2020 at 12:01

BitfulByte's user avatar

BitfulByteBitfulByte

3,9971 gold badge28 silver badges37 bronze badges

Since the indexing in ArrayList starts from 0 and ends one place before the actual size hence the correct statement to return the last arraylist element would be:

int last = mylist.get(mylist.size()-1);

For example:

if size of array list is 5, then size-1 = 4 would return the last array element.

answered Jan 13, 2020 at 9:09

shravyaverma's user avatar

guava provides another way to obtain the last element from a List:

last = Lists.reverse(list).get(0)

if the provided list is empty it throws an IndexOutOfBoundsException

answered Apr 9, 2020 at 19:42

pero_hero's user avatar

pero_heropero_hero

2,8133 gold badges9 silver badges21 bronze badges

4

This worked for me.

private ArrayList<String> meals;
public String take(){
  return meals.remove(meals.size()-1);
}

answered Dec 13, 2020 at 7:24

Med Sep's user avatar

Med SepMed Sep

3381 silver badge6 bronze badges

The last item in the list is list.size() - 1. The collection is backed by an array and arrays start at index 0.

So element 1 in the list is at index 0 in the array

Element 2 in the list is at index 1 in the array

Element 3 in the list is at index 2 in the array

and so on..

answered Nov 25, 2015 at 11:28

MircoProgram's user avatar

1

How about this..
Somewhere in your class…

List<E> list = new ArrayList<E>();
private int i = -1;
    public void addObjToList(E elt){
        i++;
        list.add(elt);
    }


    public E getObjFromList(){
        if(i == -1){ 
            //If list is empty handle the way you would like to... I am returning a null object
            return null; // or throw an exception
        }

        E object = list.get(i);
        list.remove(i); //Optional - makes list work like a stack
        i--;            //Optional - makes list work like a stack
        return object;
    }

answered Dec 12, 2014 at 23:48

rokrfellr's user avatar

If you modify your list, then use listIterator() and iterate from last index (that is size()-1 respectively).
If you fail again, check your list structure.

Bernhard Barker's user avatar

answered Oct 28, 2010 at 12:43

dae's user avatar

All you need to do is use size() to get the last value of the Arraylist.
For ex. if you ArrayList of integers, then to get last value you will have to

int lastValue = arrList.get(arrList.size()-1);

Remember, elements in an Arraylist can be accessed using index values. Therefore, ArrayLists are generally used to search items.

Undo's user avatar

Undo

25.4k37 gold badges106 silver badges129 bronze badges

answered Feb 14, 2016 at 1:42

user4660857's user avatar

user4660857user4660857

7336 silver badges6 bronze badges

1

arrays store their size in a local variable called ‘length’. Given an array named “a” you could use the following to reference the last index without knowing the index value

a[a.length-1]

to assign a value of 5 to this last index you would use:

a[a.length-1]=5;

answered Apr 5, 2017 at 2:57

closeab's user avatar

1

To Get the last value of arraylist in JavaScript :

var yourlist = ["1","2","3"];
var lastvalue = yourlist[yourlist.length -1];

It gives the output as 3 .

answered Oct 23, 2021 at 9:06

Prasoon Mishra's user avatar

2

Alternative using the Stream API:

list.stream().reduce((first, second) -> second)

Results in an Optional of the last element.

answered Dec 4, 2018 at 16:51

Terran's user avatar

TerranTerran

1,05117 silver badges29 bronze badges

0

In Kotlin, you can use the method last:

val lastItem = list.last()

answered Sep 8, 2019 at 2:41

Ollie's user avatar

OllieOllie

1,5811 gold badge12 silver badges30 bronze badges

2

If you are doing this just once, then Peter Lawrey’s solution is shorter, though IMO it is harder to understand than the original version.

If you are doing this in multiple places then the following is better:

public String lastToken(String str, String separatorRegex) {
    String tokens[] = str.split(separatorRegex);
    return tokens[tokens.length - 1];
}

and then

String lastToken = lastToken(sentence, " ");

… which is more elegant than any clever hack … IMO.


My more general point is that time spent trying to make a single line of code shorter is probably time wasted … or worse:

  • From the perspective of SOMEONE ELSE reading your code, one lines versus two lines is irrelevant.
  • If the clever hack that makes the line shorter is obscure, then you have actually done a BAD THING by using it … from the perspective of the next guy who reads / maintains your code.
  • If the clever hack is less efficient than the inelegant version, you may have introduced a performance issue.

But if you are repeating that line of code (or similar) in lots of places, then the best solution is to use procedural abstraction. Write a static or instance method … once … and call it multiple times.

В этом посте мы обсудим, как получить последнее значение списка в Java.

1. Использование List.get() метод

The size() Метод возвращает общее количество элементов, присутствующих в списке. Чтобы получить последний элемент, вы можете использовать выражение L.get(L.size() - 1) куда L это ваш список. Вот полный код:

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

class Main

{

    public static void main(String[] args)

    {

        List<Character> chars = IntStream.rangeClosed(65, 90)

                    .mapToObj(x -> (char)x)

                    .collect(Collectors.toList());

        Character lastItem = chars.get(chars.size() 1);

        System.out.println(lastItem);        // ‘Z’

    }

}

Скачать  Выполнить код

 
Это, однако, бросает IndexOutOfBoundsException если список пуст. Чтобы справиться с этим, вы можете создать служебный метод с дополнительной проверкой размера в списке перед вызовом его get() метод.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

class Main

{

    public static <T> T getLast(List<T> list) {

        if (list != null && !list.isEmpty()) {

            return list.get(list.size() 1);

        }

        return null;

    }

    public static void main(String[] args)

    {

        List<Character> chars = IntStream.rangeClosed(65, 90)

                .mapToObj(x -> (char)x)

                .collect(Collectors.toList());

        Character lastItem = getLast(chars);

        System.out.println(lastItem);        // ‘Z’

    }

}

Скачать  Выполнить код

2. Использование Guava

С Google Guava вы можете использовать Iterables.getLast() метод, разработанный специально для получения последнего элемента итерируемого объекта.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import com.google.common.collect.Iterables;

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

class Main

{

    public static void main(String[] args)

    {

        List<Character> chars = IntStream.rangeClosed(65, 90)

                .mapToObj(x -> (char)x)

                .collect(Collectors.toList());

        Character lastItem = Iterables.getLast(chars);

        System.out.println(lastItem);        // ‘Z’

    }

}

Скачать код

 
Этот метод вызовет java.util.NoSuchElementException если итерабельность пуста. Однако вы можете указать значение по умолчанию во втором параметре Iterables.getLast() способ избежать исключения.

import com.google.common.collect.Iterables;

import java.util.List;

class Main

{

    public static void main(String[] args)

    {

        List<Integer> emptyList = List.of();

        Integer lastItem = Iterables.getLast(emptyList, null);

        System.out.println(lastItem);        // null

    }

}

Скачать код

3. Использование потокового API

Вот решение, использующее Stream API. Идея состоит в том, чтобы получить поток всех элементов в списке, пропустив первый n-1 элементы в нем, где n размер списка и возвращает единственный элемент, оставшийся в потоке.

Этот подход демонстрируется ниже. Это не рекомендуется для списков с поддержкой RandomAccess, так как это требует линейного времени, а не O(1) время рассмотренными выше методами.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

class Main

{

    public static <T> T getLast(List<T> list) {

        return list.stream().skip(list.size() 1).findFirst().orElse(null);

    }

    public static void main(String[] args)

    {

        List<Character> chars = IntStream.rangeClosed(65, 90)

                .mapToObj(x -> (char)x)

                .collect(Collectors.toList());

        Character lastItem = getLast(chars);

        System.out.println(lastItem);        // ‘Z’

    }

}

Скачать  Выполнить код

4. Использование цикла

Наивным подходом будет использование цикла for для перебора массива и возврата последнего элемента. Этот подход не рекомендуется, так как он очень неэффективен.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

class Main

{

    public static <T> T getLast(List<T> list) {

        T lastItem = null;

        for (T e : list) {

            lastItem = e;

        }

        return lastItem;

    }

    public static void main(String[] args)

    {

        List<Character> chars = IntStream.rangeClosed(65, 90)

                .mapToObj(x -> (char)x)

                .collect(Collectors.toList());

        Character lastItem = getLast(chars);

        System.out.println(lastItem);        // ‘Z’

    }

}

Скачать  Выполнить код

Это все о получении последнего значения списка в Java.

Операции с массивами в Java

1. обзор

Любой разработчик Java знает, что создание чистого и эффективного решения при работе с операциями с массивами не всегда легко. Тем не менее, они являются центральным элементом экосистемы Java, и нам придется иметь дело с ними несколько раз.

По этой причине хорошо иметь «шпаргалку» – сводку наиболее распространенных процедур, которая поможет нам быстро решить головоломку. Этот учебник пригодится в таких ситуациях.

2. Массивы и вспомогательные классы

Прежде чем продолжить, полезно понять, что такое массив в Java и как его использовать. Если вы впервые работаете с ним на Java, рекомендуем взглянуть наthis previous post, где мы рассмотрели все основные концепции.

Обратите внимание, что основные операции, которые поддерживает массив, определенным образом ограничены. Когда дело доходит до массивов, нередко можно увидеть сложные алгоритмы для выполнения относительно простых задач.

По этой причине для большинства наших операций мы будем использовать вспомогательные классы и методы, чтобы помочь нам: классArrays, предоставляемый Java, и класс ApacheArrayUtils.

Чтобы включить последний в наш проект, нам нужно добавить зависимостьApache Commons:


    org.apache.commons
    commons-lang3
    3.8.1

Мы можем проверить последнюю версию этого артефактаon Maven Central.

3. Получить первый и последний элемент массива

Это одна из наиболее распространенных и простых задач благодаря индексируемости массивов.

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

int[] array = new int[] { 3, 5, 2, 5, 14, 4 };

Зная, что первый элемент массива связан со значением индекса 0 и что у него есть атрибутlength, который мы можем использовать, несложно выяснить, как мы можем получить эти два элемента:

int firstItem = array[0];
int lastItem = array[array.length - 1];

4. Получить случайное значение из массива

Используя объектjava.util.Random, мы можем легко получить любое значение из нашего массива:

int anyValue = array[new Random().nextInt(array.length)];

5. Добавить новый элемент в массив

Как мы знаем, массивы содержат фиксированный размер значений. Следовательно, мы не можем просто добавить элемент и превысить этот лимит.

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

К счастью, классArrays предоставляет удобный метод для репликации значений массива в новую структуру другого размера:

int[] newArray = Arrays.copyOf(array, array.length + 1);
newArray[newArray.length - 1] = newItem;

При желании, если классArrayUtils доступен в нашем проекте, мы можем использовать егоadd method  (или его альтернативуaddAll) для достижения нашей цели в однострочном выражении:

int[] newArray = ArrayUtils.add(array, newItem);

Как мы можем представить, этот метод не изменяет исходный объектarray; мы должны назначить его вывод новой переменной.

6. Вставьте значение между двумя значениями

Из-за его символа индексированных значений вставка элемента в массив между двумя другими не является простой задачей.

Apache посчитал это типичным сценарием и реализовал метод в своем классеArrayUtils для упрощения решения:

int[] largerArray = ArrayUtils.insert(2, array, 77);

Мы должны указать индекс, в который мы хотим вставить значение, и на выходе будет новый массив, содержащий большее количество элементов.

Последний аргумент является переменным аргументом (a.k.a. vararg), таким образом, мы можем вставить любое количество элементов в массив.

7. Сравнить два массива

Несмотря на то, что массивы являютсяObjects и, следовательно, предоставляют методequals, они используют его реализацию по умолчанию, полагаясь только на ссылочное равенство.

В любом случае мы можем вызвать методjava.util.Arraysequals, чтобы проверить, содержат ли два объекта массива одинаковые значения:

boolean areEqual = Arrays.equals(array1, array2);

Примечание: этот метод не эффективен дляjagged arrays. Подходящим методом проверки равенства многомерных структур является методArrays.deepEquals.

8. Проверьте, пуст ли массив

Это несложное присвоение, имея в виду, что мы можем использовать атрибут массивовlength:

boolean isEmpty = array == null || array.length == 0;

Более того, у нас также есть нулевой безопасный метод во вспомогательном классеArrayUtils, который мы можем использовать:

boolean isEmpty = ArrayUtils.isEmpty(array);

Эта функция по-прежнему зависит от длины структуры данных, которая также рассматривает нули и пустые подмассивы как допустимые значения, поэтому нам придется следить за этими крайними случаями:

// These are empty arrays
Integer[] array1 = {};
Integer[] array2 = null;
Integer[] array3 = new Integer[0];

// All these will NOT be considered empty
Integer[] array3 = { null, null, null };
Integer[][] array4 = { {}, {}, {} };
Integer[] array5 = new Integer[3];

9. Как перемешать элементы массива

Чтобы перемешать элементы в массиве, мы можем использовать функциюArrayUtil:

ArrayUtils.shuffle(array);

Это методvoid, работающий с фактическими значениями массива.

10. Box и Unbox Массивы

Мы часто встречаем методы, которые поддерживают только массивы на основеObject.

И снова вспомогательный классArrayUtils пригодится, чтобы получить коробочную версию нашего примитивного массива:

Integer[] list = ArrayUtils.toObject(array);

Обратная операция также возможна:

Integer[] objectArray = { 3, 5, 2, 5, 14, 4 };
int[] array = ArrayUtils.toPrimitive(objectArray);

11. Удалить дубликаты из массива

Самый простой способ удалить дубликаты – преобразовать массив в реализациюSet.

Как мы, возможно, знаем,Collections использует Generics и, следовательно, не поддерживает примитивные типы.

По этой причине, если мы не обрабатываем объектно-ориентированные массивы, как в нашем примере, нам сначала нужно упаковать наши значения:

// Box
Integer[] list = ArrayUtils.toObject(array);
// Remove duplicates
Set set = new HashSet(Arrays.asList(list));
// Create array and unbox
return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));

Кроме того, если нам нужно сохранить порядок наших элементов, мы должны использовать другую реализациюSet, такую ​​какLinkedHashSet.

12. Как напечатать массив

Как и в случае с методомequals, функция массиваtoString использует реализацию по умолчанию, предоставляемую классомObject, что не очень полезно.

Оба классаArrays иArrayUtils поставляются со своими реализациями для преобразования структур данных в читаемыйString.

Помимо немного другого формата, который они используют, самое важное различие заключается в том, как они обрабатывают многомерные объекты.

Класс Java Util предоставляет два статических метода, которые мы можем использовать:

  • toString: не работает с зубчатыми массивами

  • deepToString: поддерживает любые массивы на основеObject, но не компилируется с аргументами примитивных массивов

С другой стороны,Apache’s implementation offers a single toString method that works correctly in any case:

String arrayAsString = ArrayUtils.toString(array);

13. Сопоставить массив с другим типом

Часто бывает полезно применять операции ко всем элементам массива, возможно, преобразовывая их в другой тип объекта.

С этой цельюwe’ll try to create a flexible helper method using Generics:

public static  U[] mapObjectArray(
  T[] array, Function function,
  Class targetClazz) {
    U[] newArray = (U[]) Array.newInstance(targetClazz, array.length);
    for (int i = 0; i < array.length; i++) {
        newArray[i] = function.apply(array[i]);
    }
    return newArray;
}



Если мы не используем Java 8 в нашем проекте, мы можем отказаться от аргументаFunction и создать метод для каждого сопоставления, которое нам необходимо выполнить.

Теперь мы можем повторно использовать наш универсальный метод для различных операций. Давайте создадим два тестовых примера, чтобы проиллюстрировать это:

@Test
public void whenMapArrayMultiplyingValues_thenReturnMultipliedArray() {
    Integer[] multipliedExpectedArray = new Integer[] { 6, 10, 4, 10, 28, 8 };
    Integer[] output =
      MyHelperClass.mapObjectArray(array, value -> value * 2, Integer.class);

    assertThat(output).containsExactly(multipliedExpectedArray);
}

@Test
public void whenMapDividingObjectArray_thenReturnMultipliedArray() {
    Double[] multipliedExpectedArray = new Double[] { 1.5, 2.5, 1.0, 2.5, 7.0, 2.0 };
    Double[] output =
      MyHelperClass.mapObjectArray(array, value -> value / 2.0, Double.class);

    assertThat(output).containsExactly(multipliedExpectedArray);
}

Для примитивных типов нам сначала нужно упаковать наши значения.

В качестве альтернативы мы можем обратиться кJava 8’s Streams, чтобы выполнить отображение за нас.

Сначала нам нужно преобразовать массив вStream изObjects. Мы можем сделать это с помощью методаArrays.stream.

Например, если мы хотим сопоставить наши значенияint с пользовательским представлениемString, мы реализуем это:

String[] stringArray = Arrays.stream(array)
  .mapToObj(value -> String.format("Value: %s", value))
  .toArray(String[]::new);


14. Фильтровать значения в массиве

Фильтрация значений из коллекции – это обычная задача, которую нам, возможно, придется выполнять более одного раза.

Это потому, что в то время, когда мы создаем массив, который будет получать значения, мы не можем быть уверены в его окончательном размере. Следовательно,we’ll rely on the Streams approach again.

Представьте, что мы хотим удалить все нечетные числа из массива:

int[] evenArray = Arrays.stream(array)
  .filter(value -> value % 2 == 0)
  .toArray();

15. Другие общие операции с массивами

16. Заключение

Массивы – одна из основных функций Java, и поэтому очень важно понимать, как они работают, и знать, что мы можем и что не можем с ними делать.

В этом уроке мы узнали, как правильно обрабатывать операции с массивами в обычных сценариях.

Как всегда, полный исходный код рабочих примеров доступен наour Github repo.

Добавить комментарий