Saya memiliki sepotong kode dan saya agak bingung bagaimana menangani masalah saya, jadi silakan tinjau metode di bawah ini. Saya mencoba mencari solusi tetapi sayangnya tidak ada yang sesuai dengan kebutuhan saya, jadi saya mencari saran di sini. Metode ini mengambil String dan menghapus karakter duplikat jadi misalnya - input: ABBCDEF harus mengembalikan ABCDEF, tetapi ketika memasukkan i+1 di iterasi terakhir saya mendapat Pengecualian IndexOutOfBound, jadi saya bisa mengulangi hingga string.length-1 tapi kemudian saya lepas elemen terakhir, apa solusi paling CERDAS menurut Anda, terima kasih.

public String removeDuplicates(String source){
        if(source.length() < 2){
            return source;
        }

        StringBuilder noDuplicates = new StringBuilder();
        char[] string = source.toCharArray();

        for(int i = 0; i < string.length-1; i++){
            if(string[i] != string[i+1]){
                noDuplicates.append(string[i]);
            }
        }
        return noDuplicates.toString();
    }
0
just_curious 2 Juli 2021, 00:32

5 jawaban

Jawaban Terbaik

Anda dapat melakukannya seperti ini: tambahkan karakter pertama di source, lalu tambahkan hanya karakter berikutnya jika tidak sama dengan karakter yang ditambahkan sebelumnya.

if (source.isEmpty()) {
  return source; // Or "", it doesn't really matter.
}
StringBuilder sb = new StringBuilder();
sb.append(source.charAt(0));
for (int i = 1; i < source.length(); ++i) {
  char c = source.charAt(i);
  if (c != sb.charAt(sb.length() - 1)) {
    sb.append(c);
  }
}
return sb.toString();

Tetapi jika Anda ingin melakukan ini dengan lebih ringkas, Anda bisa melakukannya dengan regex:

return source.replaceAll("(.)\\1+", "$1");
0
Andy Turner 2 Juli 2021, 09:07

Anda cukup menambahkan karakter terakhir setelah loop:

public String removeDuplicates(String source){

    ...

    noDuplicates.append(string[string.length - 1]);
    return noDuplicates.toString();
}
0
Henry Twist 1 Juli 2021, 21:36

Anda memiliki kesalahan logika sederhana: Anda membuat string menjadi array char. Itu bagus, tetapi properti panjang dari array apa pun akan menunjukkan kepada Anda cara menghitung manusia jika ada sesuatu di dalamnya.

Jika ada 1 elemen, panjangnya adalah 1
2 -> 2
3 -> 3
dll.
Anda mendapatkan idenya.

Jadi ketika Anda menggunakan string[i + 1] Anda melangkah jauh satu karakter. Anda bisa mengubah kondisi batal menjadi

i < = string.length - 2

Atau Anda bisa menulis sebuah string iterator, untuk dapat mengakses elemen berikutnya, tapi itu sepertinya berlebihan untuk contoh ini

0
firesnake 1 Juli 2021, 21:43

Untuk inilah LinkedHashSet ! Di bawah tenda itu adalah HashSet dengan iterator untuk melacak urutan penyisipan, sehingga Anda dapat menghapus duplikat dengan menambahkan ke set, lalu merekonstruksi string dengan pemesanan yang dijamin.

public static String removeDuplicates(String source) {
    Set<String> dupeSet = new LinkedHashSet<>();

    for (Character v : source.toCharArray()) {
        dupeSet.add(v.toString());
    }

    return String.join("", dupeSet);
}
0
jeff_hinton 1 Juli 2021, 22:32

Jika Anda ingin menghapus semua karakter berulang terlepas dari posisinya di String yang diberikan, Anda mungkin ingin mempertimbangkan untuk menggunakan metode chars() yang menyediakan IntStream karakter dan yang memiliki distinct() metode untuk menyaring nilai berulang. Anda kemudian dapat menyatukannya kembali dengan StringBuilder seperti:

public class RemoveDuplicatesTest {
  public static void main(String[] args) {
    String value = "ABBCDEFE";
    System.out.println("No Duplicates: " + removeDuplicates(value));
  }
  
  public static String removeDuplicates(String value) {
    StringBuilder result = new StringBuilder();
    value.chars().distinct().forEach(c -> result.append((char) c));
    return result.toString();
  }
}
0
Tim Hunter 2 Juli 2021, 14:40