2016-04-11 10 views
0

Java Akımları için yeni biriyim ve kafama bu özel probleme yaklaşmanın "en iyi yolu" ile karşı çıkıyorum. Yaklaşık 30.000 girişten (potansiyel olarak çok daha fazla) uzun bir [] sahibim ve 100'lük parçalara ayırmam gerekiyor ve ardından alt diziyle bir API çağrısı yapmalı ve tüm 100 boyutlu parçalar oluşana kadar bunu yapmaya devam etmeliyim. işlendi. Ayrıca, başlangıç ​​listesindeki tüm girişler seçilmemelidir. Bu yüzden, orijinal diziyi işlemek, bazı kriterler bazında belirli elemanlar bazını seçerek ve sonra 100'lük parçalarda "geçerli" elemanlar toplamaya ihtiyacım var. Açıkçası, bunu bir döngüde yapabilirim ve sadece bir imleci System.arrayCopy kullanabilirim (), ya da böyle bir şey. Ama verimsiz görünüyor ve Java Stream API'sini kullanmak için çok cazipim. Bir kaç farklı yaklaşım hakkında düşünüyordum, ama ölü uçlara koşmaya devam ediyorum. Ben uzun [] öğeleri seçimimi yapmak için argüman olarak bir yöntem referans ile filter() kullanıyorum, ama geri kalanı üzerinde sıkışmış. Herhangi bir ipucu çok takdir edilir. Teşekkürler.Binlerce öğeden oluşan uzun bir [] öğeyi 100 öğe yığınına nasıl dönüştürürüm?

+0

Sadece açıklığa kavuşturmak için - Sipariş devam etmeli mi? Örneğin, akıştaki 1. ve 51. elemanlar (yüklemi karşılayanlar) aynı yığın içinde olmalıdır, değil mi? –

+0

Merhaba Kedar. Hayır, sipariş önemli değil. Sorumlulukta bundan bahsetmeliydim. – user2337270

cevap

1

Diziyi parçalar halinde bölmek için, dizin kullanmanız gerekir. Akımlar genellikle endeksleri içeren problemler için uygun değildir, ancak aşağıdaki gibi bir parça akışı elde edebilirsiniz (burada CHUNK_SIZE100 ve arrlong[]'dur). Geçen yığın genellikle CHUNK_SIZE daha uzunluğu daha az olacağı

IntStream.range(0, 1 + Math.floorDiv(arr.length - 1, CHUNK_SIZE)) 
     .mapToObj(i -> Arrays.copyOfRange(arr, i * CHUNK_SIZE, Math.min(arr.length, (i + 1) * CHUNK_SIZE))); 
     ... 

Not. Eğer filtreleme sonra parçalara bölmek istiyorsanız

, daha sonra yukarıdaki gibi parçalar bölmek sonra long[] almak için toArray() kullanın ve, filter() yapın dizinin akışı almak gerekir. Bunu akıcı bir tek katlı olarak yapmak mümkün olmazdı.

+0

Teşekkürler Paul. Alttaki diziyi 100'lük filtreli parçalar halinde bölmek için Akışları kullanmanın bir yolu olacağını ve sonuçta ortaya çıkan tüm alt dizileri tüketmek için kullanılabilecek (ve muhtemelen paralelleştirilmiş) bir Akım akışı sağlayacağını umuyordum. Örnekte kopyalama dizisi gerekli mi? Öğeleri kopyalamak zorunda kalmamayı umuyordum. Ayrıca, yukarıdaki örneğinizde olduğu gibi bir IntStream veya LongStream, Stream ve Stream değil midir? – user2337270

+0

Duh, sadece son paragrafta belirttiğiniz şeyi okuyun :-) – user2337270

İlgili konular