Rumah > Java > Senarai tatasusunan penstriman Java dan membandingkan dengan rekod sebelumnya

Senarai tatasusunan penstriman Java dan membandingkan dengan rekod sebelumnya

WBOY
Lepaskan: 2024-02-22 14:00:10
ke hadapan
674 orang telah melayarinya

editor php Yuzai membawakan kepada anda isu Soal Jawab Java ini, membincangkan cara menggunakan penstriman untuk memproses senarai tatasusunan dalam Java dan membandingkannya dengan rekod sebelumnya. Melalui artikel ini, anda akan belajar cara menggunakan keupayaan penstriman Java untuk beroperasi dengan cekap pada senarai tatasusunan dan membandingkannya dengan rekod sebelumnya. Mari kita mendalami topik ini dan meningkatkan pemahaman dan kemahiran anda tentang pengaturcaraan Java.

Kandungan soalan

Saya mempunyai kelas recorda ringkas yang mengandungi id dan nilai int. Pelbagai elemen rekod "diisih" disimpan dalam senarai.

Saya ingin mengulangi senarai dan membandingkan elemen semasa dengan elemen sebelumnya dan mencari perbezaan dalam nilainya.

Kod:

import java.util.*;  

class RecordA{
    Integer id;
    Integer value;
    
    RecordA(Integer id, Integer value) {
        this.id = id;
        this.value = value;
    }
    
    Integer getId() { return id;}
    Integer getValue() { return value;}
}

class RecordB {
    Integer id;
    Integer value;
    Integer diff;
    
    RecordB(Integer id, Integer value, Integer diff) {
        this.id = id;
        this.value = value;
        this.diff = diff;
    }
    
    Integer getId() { return id;}
    Integer getValue() { return value;}
    Integer getDiff() { return diff;}
}

class HelloWorld {
    public static void main(String[] args) {
        
        
        List<RecordA> listA = new ArrayList<>();
        RecordA recordA1 = new RecordA(1,10);
        listA.add(recordA1);
        RecordA recordA2 = new RecordA(2,15);
        listA.add(recordA2);
        RecordA recordA3 = new RecordA(3,25);
        listA.add(recordA3);
        RecordA recordA4 = new RecordA(4,30);
        listA.add(recordA4);
        
        System.out.println(listA.size());
    }
}
Salin selepas log masuk

Saya ingin membandingkan nilai rekod semasa dengan nilai rekod sebelumnya menggunakan aliran (jika boleh), memetakan hasilnya ke dalam rekodb dengan id dan nilai yang sama, tetapi menyimpan nilai semasa-sebelumnya.

Akhir sekali, senarai rekodb akan mengandungi

  • 1, 10, 0 //(10-0)
  • 2, 15, 5 //(15-10)
  • 3, 25, 10 //25-15
  • 4, 30, 5 //30-25

Saya ingin mengelakkan kelas untuk gelung dan pembolehubah previous_val. Sebarang idea bagaimana untuk melakukan ini menggunakan strim?

Penyelesaian

Anda boleh menggunakan aliran masuk

intstream.range(0, lista.size())
    .map(index -> 
        new recordb(lista.get(index).getid(), lista.get(index).getvalue(),  lista.get(index).getvalue() - (index > 0 ? lista.get(index - 1).getvalue() : 0))
    )
    .collect(collectors.tolist())
Salin selepas log masuk

Ini adalah kaedah yang sedikit tidak intuitif dan saya sebenarnya terpaksa mencarinya.
StackOverflow – Java Stream Menggunakan Elemen Sebelumnya dalam Foreach Lambda.

Biasanya, penggunaan strim adalah untuk mengagregatkan satu set nilai, tidak semestinya untuk membandingkan dan membezakannya.
Pelajaran: Operasi Agregat (Tutorial Java™ > Koleksi).

Ini adalah contoh menggunakan kelas Pengumpul dan kaedah Pengumpul#dari.

Pada asasnya, semasa pengumpulan, anda mendapatkan semula elemen sebelumnya daripada apa yang telah dikumpulkan.

Untuk parameter BiConsumer, a ialah elemen yang dikumpul setakat ini.

list<recordb> l
    = lista.stream()
           .collect(
               collector.<recorda, list<recordb>, list<recordb>>of(
                   arraylist::new,
                   (a, b) -> {
                       if (a.isempty()) a.add(new recordb(b.id, b.value, 0));
                       else {
                           recordb x = a.get(a.size() - 1);
                           a.add(new recordb(b.id, b.value, b.value - x.value));
                       }
                   },
                   (a, b) -> {
                       a.addall(b);
                       return a;
                   },
                   x -> x));
Salin selepas log masuk

Output

1, 10, 0
2, 15, 5
3, 25, 10
4, 30, 5
Salin selepas log masuk

Akhir sekali, anda mungkin mahu membuang kelas recordb dan hanya menggunakan Map.

Map<RecordA, Integer> m = new LinkedHashMap<>();
RecordA a, b;
m.put(a = listA.get(0), 0);
for (int i = 1, n = listA.size(); i < n; i++)
    m.put(b = listA.get(i), -a.value + (a = b).value);
Salin selepas log masuk

Atas ialah kandungan terperinci Senarai tatasusunan penstriman Java dan membandingkan dengan rekod sebelumnya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan