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

Senarai tatasusunan penstriman Java dan membandingkan dengan rekod sebelumnya

WBOY
WBOYke hadapan
2024-02-22 14:00:10631semak imbas

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());
    }
}

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())

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));

Output

1, 10, 0
2, 15, 5
3, 25, 10
4, 30, 5

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);

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam