Konvertuoti java masyvą į iterable

Turiu daugybę primityvų, pavyzdžiui, int, int [] foo. Jis gali būti mažas arba ne.

 int foo[] = {1,2,3,4,5,6,7,8,9,0}; 

Koks yra geriausias būdas sukurti iš jo „ Iterable<Integer> ?

 Iterable<Integer> fooBar = convert(foo); 

Pastabos:

Negalima atsakyti į ciklų naudojimą (jei negalite gerai paaiškinti, kaip kompiliatorius tai daro protingai?)

Taip pat atkreipkite dėmesį, kad

 int a[] = {1,2,3}; List<Integer> l = Arrays.asList(a); 

Nėra sudaryta

 Type mismatch: cannot convert from List<int[]> to List<Integer> 

Taip pat patikrinkite, kodėl masyvas nėra priskirtas „Iterable“? prieš atsakydami.

Be to, jei naudojate bet kurią biblioteką (pvz., Gvajavą), paaiškinkite, kodėl tai yra geriausia. (Kadangi „Google“ nėra išsamus atsakymas: P)

Galiausiai, kadangi atrodo, kad tai yra namų darbas, venkite skelbti namų kodą.

89
26 апр. nustatė ntg balandžio 26 d 2012-04-26 17:36 '12, 17:36, 2012-04-26 17:36
@ 8 atsakymai
 Integer foo[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; List<Integer> list = Arrays.asList(foo); // or Iterable<Integer> iterable = Arrays.asList(foo); 

Norėdami tai padaryti, turite naudoti „ Integer masyvą (o ne int masyvą).

Primityviam naudojimui Guava:

 Iterable<Integer> fooBar = Ints.asList(foo); 
74
26 апр. atsakymas pateikiamas fmucar 26 balandžio. 2012-04-26 17:40 '12 at 5:40 pm 2012-04-26 17:40

tik mano 2 centai:

 final int a[] = {1,2,3}; java.> 
32
10 янв. Joang Ruethschilling paskelbė sausio 10 d 2013-01-10 03:20 '13, 3:20, 2013-01-10 03:20

Naudodami „Java 8“ galite tai padaryti.

 final int[] arr = {1, 2, 3}; final PrimitiveIterator.OfInt i1 = Arrays.stream(arr).iterator(); final PrimitiveIterator.OfInt i2 = IntStream.of(arr).iterator(); final Iterator<Integer> i3 = IntStream.of(arr).boxed().iterator(); 
18
16 нояб. Atsakymą pateikė Jin Kwon, lapkričio 16 d. 2015-11-16 19:07 '15, 19:07, 2015-11-16 19:07

„Guava“ turi adapterį, kurį norite naudoti kaip „ Int.asList“ () . Kiekvienai primityviam tipui yra lygiavertė atitinkamoje klasėje, pvz.

 int foo[] = {1,2,3,4,5,6,7,8,9,0}; Iterable<Integer> fooBar = Ints.asList(foo); for(Integer i : fooBar) { System.out.println(i); } 

Pirmiau minėti sakiniai, skirti naudoti „ Arrays.asList , neveiks, net jei jie bus sukompiliuoti, nes jūs gaunate Iterator<int[]> , o ne Iterator<Integer> . Taip atsitinka, kad vietoj to, kad būtų sukurtas jūsų masyvo palaikomas sąrašas, sukūrėte 1 elementų sąrašą, kuriame yra masyvai.

18
11 янв. Atsakymas pateikiamas BeeOnRope sausio 11 d 2013-01-11 07:18 '13, 7:18, 2013-01-11 07:18

Turėjau tą pačią problemą ir išsprendžiau:

 final YourType[] yourArray = ...; return new Iterable<YourType>() { public Iterator<YourType> iterator() { return Iterators.forArray(yourArray); // Iterators is a Google guava utility } } 

Pats iteratorius yra tingus UnmodifiableIterator , bet būtent tai man reikia.

8
27 марта '13 в 17:12 2013-03-27 17:12 atsakymas į Mindas kovo 27 d. 13 d. 17:12 2013-03-27 17:12

Galite naudoti „ IterableOf iš „ Cactoos“ :

 Iterable<String> names = new IterableOf<>( "Scott Fitzgerald", "Fyodor Dostoyevsky" ); 

Tada galite jį paversti sąrašu naudodami „ ListOf :

 List<String> names = new ListOf<>( new IterableOf<>( "Scott Fitzgerald", "Fyodor Dostoyevsky" ) ); 

Arba tiesiog tai:

 List<String> names = new ListOf<>( "Scott Fitzgerald", "Fyodor Dostoyevsky" ); 
4
19 июня '17 в 12:00 2017-06-19 12:00 atsakymas pateikiamas yegor256 birželio 19 d. 17 val. 12:00 2017-06-19 12:00

Visų pirma, galiu tik sutikti, kad „ Arrays.asList(T...) yra geriausias sprendimas „Wrapper“ tipams ar masyvams su nesuderinamais duomenų tipais. Šis metodas vadina paprasto privataus statinio „ AbstractList įgyvendinimo konstruktorių „ Arrays klasėje, kuri iš esmės išsaugo tam tikrą masyvą kaip lauką ir imituoja sąrašą, viršydama būtinus metodus.

Jei savo masyvui galite pasirinkti primityvų tipą arba „Wrapper“ tipą, tokioms situacijoms norėčiau naudoti „Wrapper“ tipą, tačiau, žinoma, tai ne visada buvo naudinga ar reikalinga. Galima atlikti tik dvi parinktis:

1) Kiekvienam primityviam duomenų masyvui galite sukurti klasę su statiniu metodu ( boolean, byte, short, int, long, char, float, double , kuris grąžina Iterable< WrapperType > . Šie metodai naudos anonimines Iterator klases (išskyrus Iterable ), kurios leidžiama turėti nuorodą, kurioje yra metodo argumentas (pvz., int[] ) kaip laukas, skirtas metodų įgyvendinimui.

→ Šis metodas yra performatyvus ir išsaugo jūsų atmintį (išskyrus naujai sukurtų metodų atmintį, nors naudojant Arrays.asList() atmintį gaus taip pat)

2) Kadangi matricose nėra metodų (kad juos būtų galima perskaityti iš jūsų pusės), jie taip pat negali pateikti Iterator pavyzdžio. Jei iš tiesų esate pernelyg tingus rašyti naujas klases, turite naudoti jau egzistuojančios klasės egzempliorių, kuris įgyvendina Iterable , nes nėra kito būdo, kaip sukurti Iterable instanciją ar potipį.
Vienintelis būdas sukurti esamą kolekcijos išvestį naudojant „ Iterable yra naudoti kilpą (išskyrus anoniminių klasių naudojimą, kaip aprašyta aukščiau), arba sukuriate Iterable klasės Iterable , kurio konstruktorius leidžia primityviojo tipo masyvą (nes Object[] neleidžia masyvams su primityviais elementų tipai), tačiau, kiek žinau, „Java“ API neturi tokios klasės.

Kontūro priežastį galima lengvai paaiškinti: kiekvienai kolekcijai reikia objektų, o primityvūs duomenų tipai nėra objektai. Objektai yra daug didesni nei primityvūs tipai, todėl jiems reikalingi papildomi duomenys, kurie turi būti generuojami kiekvienam primityviojo tipo masyvo elementui. Tai reiškia, kad jei dviem iš trijų metodų (naudojant „ Arrays.asList(T...) arba naudojant esamą rinkinį) reikia rinkti objektų, reikia sukurti įvynioklio objektą kiekvienai jūsų int[] masyvo pradinei vertei. Trečias būdas būtų naudoti masyvą kaip ir naudoti jį anoniminėje klasėje, nes manau, kad tai yra geresnė dėl didelio našumo.

Taip pat yra trečioji strategija, naudojant Object argumentą kaip metodą, pagal kurį norite naudoti masyvą arba Iterable , ir tam reikės tipo patikrinimo, kad sužinotumėte, kokio tipo argumentas yra, bet aš nerekomenduotume to visko, kaip paprastai turi atsižvelgti į tai, kad objektas ne visada yra būtinas ir kad tam tikrais atvejais jums reikia atskiro kodo.

Apibendrinant, tai yra „Java“ sistemos bendrosios klaidos klaida, kuri neleidžia naudoti primityvių tipų kaip bendrinio tipo, kuris sutaupytų daug kodo tiesiog naudodamas „ Arrays.asList(T...) . Taigi, jums reikia užprogramuoti kiekvieną primityviųjų tipų masyvą, jums reikia metodo (kuris iš esmės neturi reikšmės atmintyje, kurią naudoja C ++ programa, kuri kiekvienam naudojamam argumentui sukurtų atskirą metodą).

3
29 апр. Atsakymas pateikiamas CodingVirus01 29 balandis. 2015-04-29 20:54 '15, 08:54 pm 2015-04-29 20:54

„Java“ sistemoje „IntSteam“ srautas gali būti patalpintas į sveiką skaičių srautą.

 public static Iterable<Integer> toIterable(int[] ints) { return IntStream.of(ints).boxed().collect(Collectors.toList()); } 

Manau, kad našumas priklauso nuo masyvo dydžio.

-1
29 апр. Atsakymą pateikė Soumyakanta Mohapatra balandžio 29 d. 2017-04-29 18:08 '17 at 6:08 pm 2017-04-29 18:08

Kiti klausimai apie „ ar paklauskite