Saya memiliki ArrayList(input) dari objek Node. Setiap node menyimpan informasi tentang berapa kali sebuah kalimat telah dicari. Definisi kelas Node adalah -

class Node {
    String sentence;
    int count;

    Node(String st, int t) {
        sentence = st;
        count = t;
    }
}

Atribut kalimat menyimpan kalimat dan menghitung berapa kali kalimat itu dicari. Sekarang saya diberi kalimat dan saya ingin menambahkannya ke daftar ini dengan hitungan yang diperbarui. Masalahnya adalah kalimat tersebut mungkin sudah ada dalam daftar, dalam hal ini saya hanya perlu memperbarui atribut count dari node tertentu dengan +1. Di antarmuka peta mudah dengan menggunakan -

map.put(sentence, map.getOrDefault(sentence, 0) + 1);

Tetapi bagaimana saya bisa melakukannya di Daftar?

-1
Sparsh 16 Januari 2021, 11:33

3 jawaban

Jawaban Terbaik

Seperti Anda, saya suka berorientasi objek. Map<String, Integer> tidak memuaskan. Kami ingin menggunakan kelas Node Anda.

Saya pikir yang Anda inginkan adalah Map<String, Node>. Dengan itu Anda dapat mencari simpul dari kalimat. Anda dapat menyesuaikan kelas Node Anda dengan metode untuk menambah jumlah. Dan gunakan computeIfAbsent() untuk membuat node baru seperlunya.

    Map<String, Node> map = new HashMap<>();
    
    map.computeIfAbsent("Cat", s -> new Node(s, 0)).incrementCount();
    map.computeIfAbsent("House", s -> new Node(s, 0)).incrementCount();
    map.computeIfAbsent("Cat", s -> new Node(s, 0)).incrementCount();
    
    System.out.println(map.values());

Dengan metode toString sederhana di kelas Anda, hasilnya adalah:

[Kucing: 2, Rumah: 1]

Saya juga akan merasa sangat berarti jika konstruktor Anda hanya mengambil satu argumen, kalimat, dan selalu menetapkan count ke 0. Atau Anda mungkin memiliki kedua konstruktor.

2
Ole V.V. 16 Januari 2021, 09:38

Anda dapat menggunakan filter daftar, menggunakan aliran Java 8.

list.stream().filter(node->node.sentence.equals(sentenceToSearch)).findFirst()

Seluruh kode:

import java.util.ArrayList;
import java.util.Optional;

class Node {
    String sentence;
    int count;

    Node(String st, int t) {
        sentence = st;
        count = t;
    }

    @Override
    public String toString() {
        return "Node{" +
                "sentence='" + sentence + '\'' +
                ", count=" + count +
                '}';
    }
}
public class HelloWorld{

    public static void main(String [] args) {
        ArrayList<Node> list = new ArrayList<>();
        list.add(new Node("Hello world",3));
        list.add(new Node("Hello java",2));
        list.add(new Node("I am Ironman",3000));
        updateCount("Hello world",list,4);
        updateCount("Hello sam",list,5);
        list.forEach(System.out::println);

    }

    static void  updateCount(String sentenceToSearch,ArrayList<Node> list,int updateCount){
        Optional<Node> optNode = list.stream().filter(node->node.sentence.equals(sentenceToSearch)).findFirst();

        if(optNode.isPresent()){
            Node node=optNode.get();
            node.count++;
        }else{
            list.add(new Node(sentenceToSearch,updateCount));
        }
    }

}
0
Joby Wilson Mathews 16 Januari 2021, 09:09
  • jika ditemukan -> tambah hitungannya sebesar 1
  • jika tidak -> gunakan hitungan yang diperbarui
  • pertimbangkan untuk menambahkan metode toString() di kelas Node Anda
public class NodeTester {

 public static void main(String[] args) {
     List<Node> list = new ArrayList<>();

     String sentence = "abc";
     int updatedCount = 6;

     list.add(new Node("abc", 2));
     Optional<Node> nodeSearched = list.stream().filter(n -> n.sentence.equals(sentence)).findAny();

     if (nodeSearched.isPresent()) {
         Node node = nodeSearched.get();
         node.count = node.count + 1;
     } else { // not found
         list.add(new Node(sentence, updatedCount));
     }

     System.out.println("Result " + list);

 }
}
0
deadshot 16 Januari 2021, 09:21