2
votes

Comment stocker des caractères distincts d'une chaîne

public class NoDuplicate { 
    static final int NO_OF_CHARS = 256; 
       
    /* Print duplicates present in the passed string */
    static void printDistinct(String str) 
    { 
        // Create an array of size 256 and count of 
        // every character in it 
        int[] count = new int[NO_OF_CHARS]; 
       
        /* Count array with frequency of characters */
        int i; 
        for (i = 0; i < str.length(); i++) 
            if(str.charAt(i)!=' ') 
                count[(int)str.charAt(i)]++; 
        int n = i; 
       
        // Print characters having count more than 0 
        for (i = 0; i < n; i++) 
            if (count[(int)str.charAt(i)] == 1) 
                System.out.print(str.charAt(i)); 
    } 
       
    /* Driver program*/
    public static void main(String args[]) 
    { 
        String str = "SHINCHAN"; 
        printDistinct(str); 
    } 
} 
I am trying to store the distinct characters in a string. The problem is that my code remove all duplicate elements. Example:
Input: SHINCHAN
Actual output: SICA
Desired output: SHINCA (I want to store each element once)

2 commentaires

@ShivamSharma - Pourquoi ne pas changer votre algorithme pour qu'il s'exécute sur la chaîne, lettre par lettre, et l'enregistrer. Avant d'ajouter une lettre à la chaîne, vérifiez si elle existe déjà. Si ce n'est pas le cas, ajoutez-le. Si c'est le cas - ne le faites pas.


Commentaire // Imprimer les caractères comptant plus de 0 : ce serait la bonne chose à faire. Le code réel if (count [(int) str.charAt (i)] == 1) ... ne fait pas cela. Vous avez compté les caractères correctement; le problème est tout du côté de la sortie.


3 Réponses :


4
votes

Vous pouvez utiliser un LinkedHashSet pour implémenter le même:

str.chars().mapToObj(e -> Character.toString((char) e))
           .distinct()
           .forEach(System.out::println);

Si vous utilisez java-8, vous pouvez simplement faire:

static void printDistinct(String str) {
    Set<Character> origSet = new LinkedHashSet<Character>();
    StringBuilder concat = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        if (origSet.add(str.charAt(i))) {
            concat.append(str.charAt(i));
        }
    }
    System.out.println(concat);
}


4 commentaires

Merci, @Nicholas mais Output revient sous la forme définie


Au lieu d'imprimer le Set , vous pouvez itérer dessus puis imprimer les éléments :) Quelque chose comme ça fonctionnera: origSet.forEach (System.out :: println);


puis-je le stocker dans une variable de chaîne? @Nicholas K


1) Puisque Set n'a pas de méthode get, vous ne pouvez pas faire origSet.get (i) 2) Utilisez un StringBuilder au lieu de Chaîne . Alors maintenant, tout en ajoutant l'élément au Set , vous pouvez faire: Set origSet = new LinkedHashSet (); StringBuilder concat = new StringBuilder (); for (int i = 0; i Cela fonctionnera car le add () renvoie une valeur booléenne



0
votes

Votre meilleur pari est d'imprimer les caractères de la première boucle. Imprimez-les uniquement la première fois que vous les voyez. Ensuite, vous pouvez vous débarrasser complètement de la deuxième boucle.

/* Count array with frequency of characters */
int i; 
for (i = 0; i < str.length(); i++) {
    char ch = str.charAt(i);
    if (ch != ' ') {
        count[(int) ch]++; 
        if (count[(int) ch] == 1) {
            System.out.print(ch);
        }
    }
}

Au fait, enregistrer str.charAt (i) dans une variable rendrait le code un peu plus agréable à lire.

/* Count array with frequency of characters */
int i; 
for (i = 0; i < str.length(); i++) {
    if (str.charAt(i)!=' ') {
        count[(int)str.charAt(i)]++; 
        if (count[(int)str.charAt(i)] == 1) {
            System.out.print(str.charAt(i));
        }
    }
}


0 commentaires

3
votes
static void printDistinct(String str) {
        String s="";
        Set<Character> origSet = new LinkedHashSet<Character>();
        for (int i = 0; i < str.length(); i++) {
            origSet.add(str.charAt(i));
        }
        System.out.println(origSet);
        for(char c:origSet) {
            s=s+c;
        }
        System.out.println(s);
    }
This code will store your string

0 commentaires