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)
3 Réponses :
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);
}
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); code >
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 add () renvoie une valeur booléenne
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));
}
}
}
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
@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éelif (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.