#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 спасибо тебе за поддержку и комментарий, ты отличный человек!