Utwórz listę pierwotnych int?

97

Czy istnieje sposób na utworzenie listy prymitywów int lub dowolnych prymitywów w Javie, takich jak śledzenie?

List<int> myList = new ArrayList<int>();

Wygląda na to, że mogę to zrobić List myList = new ArrayList();

i dodaj „int” do tej listy. Ale wtedy oznaczałoby to, że mogę dodać cokolwiek do tej listy.

Czy moja jedyna opcja polega na utworzeniu tablicy int i przekształceniu jej w listę lub utworzenie listy obiektów typu Integer?

Susie
źródło
Jeśli zależy Ci na wydajności, trove powinien pomóc.
assylias
Możliwe jest utworzenie listy przy użyciu podstawowej tablicy, ale na początek musisz znać rozmiar tablicy, a stracisz wiele innych funkcji, które są dostarczane z obiektem Collections. Ale możesz zrobić coś takiego: int [] array = new int [10];
Taylor

Odpowiedzi:

144

W języku Java typem dowolnej zmiennej jest typ pierwotny lub typ referencyjny. Argumenty typu ogólnego muszą być typami odwołań. Ponieważ prymitywy nie rozszerzają się, Objectnie mogą być używane jako argumenty typu ogólnego dla sparametryzowanego typu.

Zamiast tego użyj Integerklasy, która jest opakowaniem dla int:

List<Integer> list = new ArrayList<Integer>();

Jeśli używasz Java 7, możesz uprościć tę deklarację za pomocą operatora diamentu:

List<Integer> list = new ArrayList<>();

Dzięki autoboxingowi w Javie typ prymitywny intstanie się w Integerrazie potrzeby.

Autoboxing to automatyczna konwersja dokonywana przez kompilator języka Java między typami pierwotnymi i odpowiadającymi im klasami opakowania obiektów.

Tak więc obowiązuje:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1
Kevin Bowersox
źródło
1
Więc metoda JTable setSelectedIndices jest bezsensowna: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

Nie, nie ma żadnej kolekcji, która może zawierać typy pierwotne, gdy jest używana platforma Java Collection Framework.

Istnieją jednak inne kolekcje Java, które obsługują typy prymitywne, takie jak: Trove , Colt , Fastutil , Guava

Przykład tego, jak arraylista z ints wyglądałby, gdyby została użyta biblioteka Trove:

 TIntArrayList list= new TIntArrayList();

Wydajność tej listy, w porównaniu z ArrayList of Integers z kolekcji Java, jest znacznie lepsza, ponieważ nie jest potrzebne automatyczne dodawanie / rozpakowywanie do odpowiedniej klasy opakowania typu Integer.

Mike B.
źródło
1
Nie mogłem znaleźć prymitywnej implementacji kolekcji w Guava. Czy możesz podać link?
nimcap
9

Czy istnieje sposób na utworzenie listy prymitywów int lub dowolnych prymitywów w java

Nie, nie możesz. Można jedynie tworzyć listy typów referencyjnych, jak Integer, Stringlub twój typ niestandardowy.

Wygląda na to, że mogę zrobić List myList = new ArrayList();i dodać „int” do tej listy.

Po dodaniu intdo tej listy jest ona automatycznie umieszczana w ramce do Integertypu opakowania. Ale złym pomysłem jest używanie list typów surowych lub dowolnego typu ogólnego w nowszym kodzie.

Mogę dodać cokolwiek do tej listy.

Oczywiście jest to wada używania typu surowego. Możesz mieć kota , psa , tygrysa , dinozaura , wszystko w jednym pojemniku.

Jest moją jedyną opcją, tworząc tablicę int i konwertując ją na listę

W takim przypadku również otrzymasz List<Integer>tylko. Nie ma możliwości tworzenia List<int>ani żadnych prymitywów.

I tak nie powinieneś się tym przejmować. Nawet w List<Integer>tobie można dodać inttypy pierwotne. Zostanie automatycznie zapakowany, jak w poniższym przykładzie:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Rohit Jain
źródło
Dobra dyskusja na temat surowego typu.
Kevin Bowersox,
Właściwie, żeby było jasne, możesz utworzyć listę z typami pierwotnymi, używając tylko podstawowej tablicy. int [] array = new int [10];
Taylor
1
@Taylor Ale to nie będzie dynamicznie rosnąca lista. To jest tablica. I zakładam, że OP już o tym wiedział.
Rohit Jain
5

To jest niemożliwe. Specyfikacja java zabrania używania prymitywów w rodzajach. Jednak dzięki boksowi możesz tworzyć ArrayList<Integer>i dzwonić, add(i)jeśli ijest intem.

nanofarad
źródło
4

Możesz użyć kolekcji pierwotnych dostępnych w Kolekcje Eclipse . Eclipse posiada kolekcje List, Set, BagiMap dla wszystkich prymitywów. Elementy w kolekcjach prymitywnych są utrzymywane jako prymitywy i nie ma miejsca na boksowanie.

Możesz zainicjować IntList w następujący sposób:

MutableIntList ints = IntLists.mutable.empty();

Możesz przekonwertować z a List<Integer>na IntListtaki:

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Uwaga: współtworzę kolekcje Eclipse.

Nikhil Nanivadekar
źródło
3

Kolekcje używają typów ogólnych, które obsługują typy odwołań lub karty wilcards. Możesz jednak użyć Integeropakowania

List<Integer> list = new ArrayList<>();
Reimeus
źródło
0

W przypadku programowania w języku Java dla systemu Android zaleca się użycie, SparseIntArrayaby zapobiec automatycznemu blokowaniu między inta Integer.

Więcej informacji można znaleźć SparseIntArrayw dokumentacji dla programistów aplikacji na Androida oraz dobre wyjaśnienie dotyczące automatycznego blokowania w systemie Android.Wprowadź opis linku tutaj

Stefan Medack
źródło
To mocne stwierdzenie. Z pewnością SparseIntArrayjest to często lepsza opcja, ale istnieją kompromisy, o których należy pamiętać. „Implementacja nie ma być odpowiednia dla struktur danych, które mogą zawierać dużą liczbę elementów. Generalnie jest wolniejsza niż tradycyjna HashMap…”
Andy Thomas,
Tak to prawda. Całkiem dobrze opisują ten kompromis w filmie, który podlinkowałem. Ale OP poprosił o tę konkretną możliwość i chciałem tylko dodać, że jest to rzeczywiście możliwe z Androidem i zalecane w większości przypadków użycia. Dziękujemy za dodanie tych informacji!
Stefan Medack
0

Czy istnieje sposób na przekonwertowanie tablicy Integer [] na tablicę int []?

To rażące pominięcie podstawowych bibliotek Java wydaje się pojawiać w prawie każdym projekcie, nad którym kiedykolwiek pracowałem. I chociaż biblioteka Trove może być wygodna, nie jestem w stanie przeanalizować dokładnych wymagań, aby spełnić LPGL dla aplikacji na Androida, która statycznie łączy bibliotekę LGPL (preambuła mówi: OK, ciało nie wydaje się mówić tego samego). Po prostu zgrywanie i usuwanie źródeł Apache w celu uzyskania tych klas jest po prostu niewygodne. Musi być lepszy sposób.

Robin Davies
źródło
-4

Kolekcja Java powinna składać się wyłącznie z kolekcji Object.

List<Integer> integerList = new ArrayList<Integer>();

Integer to klasa opakowująca pierwotnego typu danych int.

więcej z zajęć związanych z opakowaniami JAVA tutaj !

Możesz bezpośrednio zapisać i pobrać int do / z integerList jako, integerList.add(intValue); int intValue = integerList.get(i)

Selvaraj
źródło
1
Pierwsza linia nie zostanie skompilowana, a ostatnie dwie linie kodu są wszędzie. Proszę, powstrzymaj się od tego.
The_Martian