Saya ingin tahu semua kata berbeda yang mengikuti setelah "apel". Saya menggunakan HashSet untuk mendapatkan kata-kata ini tetapi saya mengalami kesalahan.

Ini adalah metode yang saya panggil di main. Saya seharusnya mendapatkan [pisang, ceri] sebagai nilai pengembalian tetapi saya hanya mendapatkan [pisang].

ArrayList<String> test = new ArrayList<>();
        test.add("orange");
        test.add("apple");
        test.add("banana");
        test.add("cherry");
        System.out.println(test);
        System.out.println(problem1(test));

public static HashSet<String> problem1 (ArrayList<String> allWords){
        HashSet<String> words = new HashSet<>();
        String previousWord = "";
        
        for(String currentWord : allWords)
        {
            if(previousWord.equals("apple")) {
                words.add(currentWord);
                
            }
            previousWord = currentWord;
        }
        return words;
    }
-3
Abhiveer Sharma 2 Juli 2021, 16:11

3 jawaban

Jawaban Terbaik

Tugas ini dapat diselesaikan dengan bantuan metode berikut:

  • List::indexOf - untuk menemukan indeks string yang diinginkan dan menambahkannya untuk melewati string yang diinginkan
  • List::subList - dapatkan sublist dari indeks yang diinginkan

Juga mungkin lebih baik untuk mendapatkan hasilnya sebagai LinkedHashSet untuk mempertahankan urutan elemen dalam daftar input:

public static Set<String> findWordsAfter(List<String> allWords, String afterMe) {
    
    return new LinkedHashSet<>(
        allWords.subList(allWords.indexOf(afterMe) + 1, allWords.size())
    );
}

Demikian pula, Stream API dapat digunakan untuk melewati kata-kata dalam daftar input dan mengumpulkan hasilnya ke dalam satu set:

public static Set<String> findWordsAfter2(List<String> allWords, String wordAfter) {  
    return allWords.stream()
            .skip(allWords.indexOf(wordAfter) + 1)
            .collect(Collectors.toCollection(LinkedHashSet::new));
}

Tes:

List<String> words = Arrays.asList("orange", "apple", "banana", "cherry", "cherry");

List<String> lookFor = Arrays.asList("apple", "pear");

lookFor.forEach(wordAfter -> {
    System.out.printf("Getting words after '%s'%n", wordAfter);
    
    System.out.println("subList:     " + findWordsAfter(words, wordAfter));
    System.out.println("stream.skip: " + findWordsAfter2(words, wordAfter));
    
    System.out.println("----");
});

Keluaran

Getting words after 'apple'
subList:     [banana, cherry]
stream.skip: [banana, cherry]
----
Getting words after 'pear'
subList:     [orange, apple, banana, cherry]
stream.skip: [orange, apple, banana, cherry]
----
0
Alex Rudenko 4 Juli 2021, 17:11

Anda sebenarnya dapat mengurangi masalah Anda dengan langkah-langkah berikut:

  1. Temukan indeks kata kunci (di sini "apel")
  2. Tambahkan semuanya dari indeks ini + 1 (kata berikutnya) hingga akhir input
public static Set<String> problem1 (List<String> allWords){
    HashSet<String> words = new HashSet<>();
    int startIndex = allWords.indexOf("apple");
    if (startIndex == -1) {
        return words; // No match
    }
    for (int i = startIndex + 1; i < allWords.size(); i++) {
        words.add(allWords.get(i));
    }
    return words;
}
0
peterulb 2 Juli 2021, 14:19

SebelumnyaWord untuk "cherry" bukan "apple", jadi normal jika fungsinya tidak mengembalikan "cherry"

-1
Chuen 2 Juli 2021, 13:26