There are multiple approaches to accomplish this. Following post lists those.
Method 1 : Removing characters from original word
Iterate over the word entered by the user and in each iteration, add one character from the word to a java.lang.StringBuffer
and replace all the occurrences of this character in the word with a blank space. Before adding the character to the StringBuffer ensure to check that a blank is not added.
static void method1(){
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter a word");
String word = scanner.next();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
// check for an empty space
if(c != ' ') {
buffer.append(c);
}
// replace all occurrences of this character with a space
word = word.replace(c, ' ');
}
System.out.println(buffer);
scanner.close();
}
Method 2 : Using a java.util.Set
This method utilizes the property of java.util.Set
that it can contain only unique elements. If an element matching the one which is already present in the set is added, it replaces the previous element with the new one.
Iterate over the word and in every iteration add its one character to the set. If the set would already have that character, then it would replace the new character with the older one and there would be only one occurrence of that character.
After the iteration of the word is completed, iterate over the set using a java.util.Iterator
and add its contents to a java.lang.StringBuffer
. This iteration is required because if you directly print the contents of a set containing letters a,b,c it will print it as [a,b,c] which is not the required output.
Further the iteration is done using an iterator because a set does not have a method for index based access. That is, we cannot directly access an element of a set using some get(index)
method
static void method2(){
Set set = new LinkedHashSet();
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter a word");
String word = scanner.next();
for (int i = 0; i < word.length(); i++) {
set.add(word.charAt(i));
}
StringBuffer buffer = new StringBuffer();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Character character = (Character) iterator.next();
buffer.append(character);
}
System.out.println(buffer);
scanner.close()
}
Method 3 : Using java.util.List
This method is similar to the above method. In this method we use a java.util.ArrayList
instead of a set. As before, we iterate over the word and add its characters to a list. Before each add operation, check that the list already does not contain that character using contains()
method of the list. After the iteration completes, the list contains all the unique characters.
Now iterate over the list and add its contents to a java.lang.StringBuffer
. Since a list has method get()
for index based access, we can iterate over it using a traditional for
loop.
static void method3(){
List list = new ArrayList();
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter a word");
String word = scanner.next();
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if(!list.contains(c))
list.add(c);
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
buffer.append(list.get(i));
}
System.out.println(buffer);
scanner.close();
}
Let's tweak in:
java.util.LinkedHashSet
and has been used in Method 2 as it maintains the order of insertion of elements. If we would have usedjava.util.HashSet
then the order of characters would not be same every time.java.util.ArrayList
maintains the order of insertion, that is, elements are retrieved in the same order in which they were inserted.- In all the methods we have used a
java.lang.StringBuffer
as when the characters are added or modified, same StringBuffer object is used. If we usejava.lang.String
instead, then in each addition of a character, a new String object is created resulting in extra memory usage. java.lang.StringBuffer
should be used when there are chances of multiple String manipulations.- When calling
replace()
on a String object, the result should be assigned back to the original (or some other) String object else the changes will not be reflected. For Example,String word = "codippa"; word.replace('p', 'P'); System.out.println(word); // This will print "codippa". Changes gone !!! //assign it back word = word.replace('p', 'P'); System.out.println(word); // This will print "codiPPa"
This is because String is immutable. At every change a new String object is created and it needs to be assigned back to some object.
Was the post helpful. Do let us know in the space provided below. Cheers !!!