Создать массив объекта из массива int

#java #arrays

#java #массивы

Вопрос:

Очевидно, я чего-то не понимаю. У меня есть примитивный массив int s, и мне нужно преобразовать его в массив моего собственного типа. Вот что я пробовал.

 public class StupidInt {
   @JsonProperty("ID")
   private int id;

   public StupidInt(int id) { this.id = id; }

   public int getId() { return this.id; }
}

public static void main(String []args){
   int[] ints = {1,2,4,67};
   StupidInt[] myInts = IntStream.of(ints).map(StupidInt::new).collect(Collectors.toList());
}
  

Как и следовало ожидать, в строке myInts возникла проблема, и эта проблема заключается в том, что «не удается преобразовать StupidInt в int». Но я не уверен, какую комбинацию map или foreach или любых других промежуточных и терминальных методов использовать для преобразования этого массива целых чисел в массив моего объекта. Каков правильный способ выполнить это преобразование?

Ответ №1:

Вам нужно использовать mapToObj для создания нового потока объектов и toArray вместо collect получения результата в виде массива.

 StupidInt[] myInts = IntStream.of(ints).mapToObj(StupidInt::new).toArray(StupidInt[]::new);
  

Комментарии:

1. Идеально! Спасибо. Я пытался mapToObj в какой-то момент, но не знал, что добавить toArray в конце, и, конечно же, не знал, как передать конструкторы класса. (Теперь я знаю.)

2. @Machtyn рад помочь.

Ответ №2:

Ответ от @hev1 прост и является лучшим ответом для терминального метода для того, чего вы пытаетесь достичь.

Я предоставляю здесь два разных варианта, если вам нужно другое решение. Первый — это просто промежуточный метод for для создания примитивного массива; а второй вариант представляет собой совершенно иной подход к проблеме и создает не примитивный массив, а «список» типа Object, который отражает примитивный тип и также будет работать с любым типом или объектом:

Решение 1:

 int[] ints = {1,2,4,67};
StupidInt[] myInts = new StupidInt[ints.length];
for (int i = 0; i < myInts.length; i  ) {
    myInts[i] = new StupidInt(ints[i]);
}
  

Решение 2:

 public class StupidIntList {

    private ArrayList<Integer> ids;

    public StupidIntList() { 
        this.ids = new ArrayList<Integer>();
    }

    public void add(int id) {
        this.ids.add(id);
    }

    public int get(int pos) { 
        return this.ids.get(pos); 
    }

    public boolean findId(int i_d) {
        for (Integer id : ids) {
            if(id == i_d)
                return true;
        }
        return false;
    }

    public String toString() {
        String res = "[";
        for (Integer id : ids) {
            res  = id ",";
        }
        return res.substring(0, res.lastIndexOf(",")) "]";
    }

    public static void main(String []args){
        int[] ints = {1,2,4,67};
        StupidIntList myInts = new StupidIntList();
        for (int i = 0; i < ints.length; i  ) {
            myInts.add(ints[i]);
        }
        System.out.println(myInts);
    }
}
  

В этом случае для добавления нового int вы используете метод add, а для получения одного int вы будете использовать метод get (position) или метод find, чтобы посмотреть, существует ли он, и получить позицию.

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

Комментарии:

1. Спасибо за дополнительные ответы. Ответ, который я искал, был тем, что предоставил @hev1. Я пытался mapToObj , но не знал структуры и не знал, как добавить toArray в конце. Я уверен, что то, что вы предоставили, может помочь кому-то еще.

2. @Machtyn спасибо тебе за поддержку и комментарий, ты отличный человек!