web-dev-qa-db-fra.com

Java: imprimer un caractère unique dans une chaîne

J'écris un programme qui imprimera le caractère unique dans une chaîne (entrée via un scanner). J'ai créé une méthode qui essaye d'accomplir cela, mais je continue à avoir des caractères qui ne sont pas répétés, au lieu d'un caractère (ou de plusieurs caractères) unique à la chaîne. Je veux les lettres uniques seulement.

Voici mon code:

import Java.util.Scanner;
public class Sameness{
   public static void main (String[]args){
   Scanner kb = new Scanner (System.in); 
     String Word = "";

     System.out.println("Enter a Word: ");
     Word = kb.nextLine();

     uniqueCharacters(Word); 
}

    public static void uniqueCharacters(String test){
      String temp = "";
         for (int i = 0; i < test.length(); i++){
            if (temp.indexOf(test.charAt(i)) == - 1){
               temp = temp + test.charAt(i);
         }
      }

    System.out.println(temp + " ");

   }
}            

Et voici un exemple de sortie avec le code ci-dessus:

Enter a Word: 
nreena
nrea 

La sortie attendue serait: ra

5
Dextra

En fonction de la sortie souhaitée, vous devez remplacer un caractère qui a été ajouté lorsqu’il a été dupliqué ultérieurement.

public static void uniqueCharacters(String test){
    String temp = "";
    for (int i = 0; i < test.length(); i++){
        char current = test.charAt(i);
        if (temp.indexOf(current) < 0){
            temp = temp + current;
        } else {
            temp = temp.replace(String.valueOf(current), "");
        }
    }

    System.out.println(temp + " ");

}
6
lmiguelvargasf

Pourquoi ne pas appliquer le principe KISS:

public static void uniqueCharacters(String test) {
    System.out.println(test.chars().distinct().mapToObj(c -> String.valueOf((char)c)).collect(Collectors.joining()));
}
2
Bohemian

Bien que pour aborder une solution, je vous suggère d'essayer d'utiliser une meilleure structure de données et pas seulement une chaîne. Cependant, vous pouvez simplement modifier votre logique pour supprimer les doublons existants en utilisant une else comme suit:

public static void uniqueCharacters(String test) {
        String temp = "";
        for (int i = 0; i < test.length(); i++) {
            char ch = test.charAt(i);
            if (temp.indexOf(ch) == -1) {
                temp = temp + ch;
            } else {
                temp.replace(String.valueOf(ch),""); // added this to your existing code
            }
        }

        System.out.println(temp + " ");

    }
2
nullpointer

La réponse acceptée ne passera pas tous les tests, par exemple

input -"aaabcdd"

sortie désirée -"bc"
mais la réponse acceptée donnera -abc

parce que le personnage présente un nombre impair de fois.

Ici, j'ai utilisé ConcurrentHasMap pour stocker le caractère et le nombre d'occurrences de caractère puis supprimé du caractère si les occurrences sont plusieurs fois. 

import Java.util.concurrent.ConcurrentHashMap;

public class RemoveConductive {

    public static void main(String[] args) {

        String s="aabcddkkbghff";

        String[] cvrtar=s.trim().split("");

        ConcurrentHashMap<String,Integer> hm=new ConcurrentHashMap<>();
        for(int i=0;i<cvrtar.length;i++){
            if(!hm.containsKey(cvrtar[i])){
                hm.put(cvrtar[i],1);
            }
            else{
                 hm.put(cvrtar[i],hm.get(cvrtar[i])+1);
            }
        }
        for(String ele:hm.keySet()){
            if(hm.get(ele)>1){
                hm.remove(ele);
            }
        }
        for(String key:hm.keySet()){
            System.out.print(key);
        }
    }  
}
2
rajesh
public static String input = "10 5 5 10 6 6 2 3 1 3 4 5 3";

public static void uniqueValue (String numbers) {
    String [] str = input.split(" ");
    Set <String> unique = new HashSet <String> (Arrays.asList(str));
    System.out.println(unique);

    for (String value:unique) {
        int count = 0;
        for ( int i= 0; i<str.length; i++) {
            if (value.equals(str[i])) {
                count++;
            }
        }
        System.out.println(value+"\t"+count);
    }
}
public static void main(String [] args) {
    uniqueValue(input);
}
1
Dana

Ceci est une question d'entrevue. Découvrez tous les caractères uniques d'une chaîne . Voici la solution complète. Le code lui-même est explicite.

public class Test12 {
    public static void main(String[] args) {
        String a = "ProtijayiGiniGina";

        allunique(a);
    }

    private static void allunique(String a) {
        int[] count = new int[256];// taking count of characters
        for (int i = 0; i < a.length(); i++) {
            char ch = a.charAt(i);
            count[ch]++;
        }

        for (int i = 0; i < a.length(); i++) {
            char chh = a.charAt(i);
            // character which has arrived only one time in the string will be printed out
            if (count[chh] == 1) {
                System.out.println("index => " + i + " and unique character => " + a.charAt(i));

            }
        }

    }// unique

}

En Python:

def firstUniqChar(a):
    count = [0] *256
    for i in a: count[ord(i)] += 1
    element = ""

    for item in a:
        if (count[ord(item)] == 1):
            element = item;
            break;
    return element        


a = "GiniGinaProtijayi";
print(firstUniqChar(a)) # output is P
1
Soudipta Dutta
public class UniqueCharactersInString {


 public static void main(String []args){

    String input = "aabbcc";
    String output = uniqueString(input);

    System.out.println(output);
 }

 public static String uniqueString(String s){
     HashSet<Character> uniques = new HashSet<>();
     uniques.add(s.charAt(0));
     String out = "";
     out += s.charAt(0);

     for(int i =1; i < s.length(); i++){
         if(!uniques.contains(s.charAt(i))){
             uniques.add(s.charAt(i));
             out += s.charAt(i);
         }
     }
     return out;
 }
}

Quelles seraient les insuffisances de cette réponse? Comment se compare-t-il aux autres réponses?

0
Zulu

J'utilise cette méthode pour obtenir des caractères uniques

for (int i=0; i< input.length();i++)
    if(input.indexOf(input.charAt(i)) == input.lastIndexOf(input.charAt(i)))
        System.out.println(input.charAt(i) + "  is unique");
0
Parviz Makari
import Java.util.*;
import Java.lang.*;
class Demo
{
public static void main(String[] args)
{

Scanner sc=new Scanner(System.in);
System.out.println("Enter String");
String s1=sc.nextLine();
 try{
HashSet<Object> h=new HashSet<Object>();
for(int i=0;i<s1.length();i++)
{
h.add(s1.charAt(i));
}
Iterator<Object> itr=h.iterator();
  while(itr.hasNext()){
   System.out.println(itr.next());
    }
    }
    catch(Exception e)
    {
    System.out.println("error");
    }
}
}
0
shanbhagsv

En fonction de la sortie souhaitée, vous pouvez remplacer chaque caractère déjà présent par un caractère vierge.

public static void uniqueCharacters(String test){
  String temp = "";
  for(int i = 0; i < test.length(); i++){
      if (temp.indexOf(test.charAt(i)) == - 1){
         temp = temp + test.charAt(i);
      } else {
         temp.replace(String.valueOf(temp.charAt(i)), "");
      }
 }

System.out.println(temp + " ");

}

0
BHARAT Bhasin

Si vous ne souhaitez pas utiliser d'espace supplémentaire:

    String abc="developer";

    System.out.println("The unique characters are-");

    for(int i=0;i<abc.length();i++)
    {
        for(int j=i+1;j<abc.length();j++)
        {
            if(abc.charAt(i)==abc.charAt(j))
                abc=abc.replace(String.valueOf(abc.charAt(j))," ");
        }
    }   
    System.out.println(abc);

Complexité temporelle O (n ^ 2) et pas d'espace.

0
Anand Chouksey
public void uniq(String inputString) {
    String result = "";
    int inputStringLen = inputStr.length();
    int[] repeatedCharacters = new int[inputStringLen];
    char inputTmpChar;
    char tmpChar;

    for (int i = 0; i < inputStringLen; i++) {
        inputTmpChar = inputStr.charAt(i);
        for (int j = 0; j < inputStringLen; j++) {
            tmpChar = inputStr.charAt(j);
            if (inputTmpChar == tmpChar)
                repeatedCharacters[i]++;
        }
    }

    for (int k = 0; k < inputStringLen; k++) { 
        inputTmpChar = inputStr.charAt(k);
        if (repeatedCharacters[k] == 1)
            result = result + inputTmpChar + " ";
    }

    System.out.println ("Unique characters: " + result);
}

En premier pour la boucle, je compte le nombre de répétitions du caractère dans la chaîne. 
Dans la deuxième ligne, je cherche des personnages répétitifs une fois. 

0
ptaq

Je voudrais stocker tous les caractères de la chaîne dans un tableau que vous allez parcourir pour vérifier si les caractères actuels y apparaissent plusieurs fois. Si ce n'est pas le cas, ajoutez-le à temp.

public static void uniqueCharacters(String test) {
    String temp = "";
    char[] array = test.toCharArray();
    int count; //keep track of how many times the character exists in the string

    outerloop: for (int i = 0; i < test.length(); i++) {
        count = 0; //reset the count for every new letter
        for(int j = 0; j < array.length; j++) {
            if(test.charAt(i) == array[j])
                count++;
            if(count == 2){
                count = 0;
                continue outerloop; //move on to the next letter in the string; this will skip the next two lines below
            }
        }
        temp += test.charAt(i);
        System.out.println("Adding.");
    }    
    System.out.println(temp);
}

J'ai ajouté des commentaires pour plus de détails.

0
Gendarme

Cet algorithme String est utilisé pour imprimer des caractères uniques dans une chaîne. Il s'exécute dans O(n) runtime, n étant la longueur de la chaîne.Il prend en charge les caractères ASCII uniquement.

static String printUniqChar(String s) {
    StringBuilder buildUniq = new StringBuilder();
    boolean[] uniqCheck = new boolean[128];
    for (int i = 0; i < s.length(); i++) {
        if (!uniqCheck[s.charAt(i)]) {
            uniqCheck[s.charAt(i)] = true;
            if (uniqCheck[s.charAt(i)])
                buildUniq.append(s.charAt(i));
        }
    }
0
RathanaKumar