Remove characters from String which are contained in another String [closed] - java

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed last month.
Improve this question
I've written a method that is intended to remove characters from a string which are specified by another string.
I'll show you what I've written first so it becomes easier to comprehend my issue:
public static String removeFromInventory(String input, String inventory) {
for (int i = 0; i < input.length(); i++) {
char character = input.charAt(i);
for (int j = 0; j < inventory.length(); j++) {
if (inventory.charAt(j) == character) {
inventory = inventory.replace(character, ' ');
break;
}
}
}
for (int i = 0; i < input.length(); i++) {
if (inventory.charAt(i) == ' ') {
inventory = inventory.replaceAll("\\s+","");
}
}
return inventory;
}
Imagine my input String looks like this: "11+" and my inventory String like this: "111234++". Now what I want to achieve is the following: I want to remove "11+" from the inventory string, so it looks like this afterwards: "11234+".
My code obviously removes any occurrence of the characters in the string. The the return statement looks like this after going through the function: "234".
If you know how I could implement some logic to only remove the first occurrence of the character I would greatly appreciate it. Thanks for any help in advance!

Solution 1:
The function iterates through each character of the "input" string in a loop and utilizes the String.replaceFirst() method and a regular expression pattern constructed with Pattern.quote to replace the "+" has a special meaning in regex, so it needs to be escaped/quoted. The function's output is then the resultant "inventory" string without the given characters. By doing this, it will eliminate every occurrence of the characters from the inventory string. As anticipated, the final result is "1234+".
public static String removeChars(String input, String inventory) {
for (int i = 0; i < input.length(); i++)
inventory = inventory.replaceFirst(Pattern.quote(String.valueOf(input.charAt(i))), "");
return inventory;
}
Solution 2:
The second solution is more optimized as it uses a HashMap to store the count of characters in the input, so it can handle the case of removing characters in input multiple times. It also uses StringBuilder for building the final string, which is more efficient than concatenating strings.
public static String removeCharacters(String input, String inventory){
StringBuilder sb = new StringBuilder();
HashMap<Character, Integer> inputCount = new HashMap<>();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
inputCount.put(c, inputCount.getOrDefault(c, 0) + 1);
}
for (int i = 0; i < inventory.length(); i++) {
char c = inventory.charAt(i);
if (!inputCount.containsKey(c) || inputCount.get(c) == 0) {
sb.append(c);
} else {
inputCount.put(c, inputCount.get(c) - 1);
}
}
return sb.toString();
}

The documentation for the method says
"Returns a string resulting from replacing all occurrences of oldChar in this string with newChar."
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/String.html#replace(char,char)
substring would be an OK replacement if used like this.
for (int j = 0; j < inventory.length(); j++) {
if (inventory.charAt(j) == character) {
inventory = inventory.substring(0,j) + ' ' + inventory.substring(j+1);
break;
}
}

Related

In this sentence reversal program, why has char been used and not String? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed last year.
Improve this question
I was doing a few beginner coding challenges and one of the challenge was making a program that reverses a given String. It worked on words, but as soon as I put in words with spaces between them the program only reversed the first word entered.
I googled "reverse words with spaces in it java" and found this:
// Java program to reverse a string
// preserving spaces.
public class ReverseStringPreserveSpace {
// Function to reverse the string
// and preserve the space position
static void reverses(String str)
{
char[] inputArray = str.toCharArray();
char[] result = new char[inputArray.length];
// Mark spaces in result
for (int i = 0; i < inputArray.length; i++) {
if (inputArray[i] == ' ') {
result[i] = ' ';
}
}
// Traverse input string from beginning
// and put characters in result from end
int j = result.length - 1;
for (int i = 0; i < inputArray.length; i++) {
// Ignore spaces in input string
if (inputArray[i] != ' ') {
// ignore spaces in result.
if (result[j] == ' ') {
j--;
}
result[j] = inputArray[i];
j--;
}
}
System.out.println(String.valueOf(result));
}
// driver function
public static void main(String[] args)
{
reverses("internship at geeks for geeks");
}
}
Why were char arrays used instead of String directly?
Can I modify my own code to make it reverse a sentence without following the above code?
My code:
import java.util.Scanner;
class ReverseString
{
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter the word to be reversed:");
String input = s.next();
String reversed = "";
for (int i = 0; i < input.length(); i++)
{
char ch = input.charAt(i);
reversed = ch + reversed;
}
System.out.println(reversed);
}
}
The solution that you found above was a highly over engineered solution to a very simple problem.
Sometimes its better to use char arrays when performing operations on strings because it might increase performance. Strings in java are immutable and every time you mutate a String a new String object is created. So char array can be used to increase the performance of the code.
Your code is working fine with sentences when I checked it. I don't really know what issue you are facing.
Edit : You should avoid using scanner.next(); method when taking an input string. Because it only read the string up until a space. Therefore your program is not reading the entire string that you entered.
You should instead use scanner.nextLine(); for reading a String value.
For more info on Scanner class : http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
This is a pretty good way of Reversing a String. This probably the most efficient way of reversing a String.
public String reverseString(String input) {
char[] arr = input.toCharArray();
int i = 0, j = arr.length - 1;
while(i < j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++; j--;
}
return new String(arr);
}

Result of "Character.toUpperCase" is ignored

this is my first question here and I've been desperate enough to ask it, since I haven't found any other posts related to my problems or which are related but too complex and don't relate to the actual code I have.
The thing is I want to ask the user for input and the input's letters shall be inverted, e.g: Hello to hELLO and vice versa. But the warning comes up "Result of 'Character.toUpperCase()' is ignored", any idea how to solve?
for (int i = 0; i < word.length(); i++)
{
if (Character.isLowerCase(word.charAt(i)))
{
Character.toUpperCase(word.charAt(i));
}
else
{
Character.toLowerCase(word.charAt(i));
}
}
Hello and welcome to Stack overflow.
The problem is that the Character.toUpperCase() won't overwrite the character in the string.
public static void main(String[] args) {
String word = "Hello";
String wordInverted = "";
for (int i = 0; i < word.length(); i++)
{
//Get the char as a substring
String subChar = word.substring(i, i+1);
if (Character.isUpperCase(word.charAt(i)))
{
subChar = subChar.toLowerCase();
}
else
{
subChar = subChar.toUpperCase();
}
wordInverted += subChar; //Add the newly inverted character to the inverted string
}
System.out.println(wordInverted);
}

Java find difference between characters in StringBuffer

I'm working on an Anagram program and I'm currently working on a method called diff which should return a StringBuffer containing the chars that are in the first StringBuffer but not in the second one. So for example if the StringBuffers are abba and acca, then my diff method should return bb. So far I currently have loop with an if statement but it's not working. Any help would be appreciated. Thanks
public StringBuffer diff(){
StringBuffer diffVal = null;
for (int i =0; i < sBuffer1.length(); i++){
String let1 = String.valueOf(sBuffer1);
if (sBuffer2.indexOf(let1) == -1 ){
}
}
return diffVal;
I think you are trying to use a loop to examine one character by one character in sBuffer1. But String let1 = String.valueOf(sBuffer1); gives you the entire string of sBuffer1.
What you need is String let1 = sBuffer1.substring(i, i + 1) to take a single character from sBuffer1 to check if it exists in sBuffer2.
For example:
public static StringBuffer diff(StringBuffer sBuffer1, StringBuffer sBuffer2) {
StringBuffer diffVal = new StringBuffer();
for (int i = 0; i < sBuffer1.length(); i++) {
String let1 = sBuffer1.substring(i, i + 1); // get the character from sBuffer1
if (sBuffer2.indexOf(let1) == -1) {
diffVal.append(let1); // append the character to the diff
}
}
return diffVal;
}
ok this might work, your logic was a little bit wrong, this code is straight forward. search for the character if it doesn't exist in the second string buffer add it to the result SF.
public StringBuffer diff(){
StringBuffer diffVal = new StringBuffer();//initialize before you use it.
for (int i =0; i < sBuffer1.length(); i++){
String let1 = String.valueOf(sBuffer1.charAt(i))//get the character at the ith position.
if (sBuffer2.indexOf(let1) == -1 ){
diffVal.append(let1);
}
}
return diffVal;
}
Try this.
StringBuilder diffVal= new StringBuilder();
StringBuffer sBuffer1 = new StringBuffer("abbad");//input 1
StringBuffer sBuffer2 = new StringBuffer("acca");//input 2, you can ignore if you have already passed/defined these
for (int i =0; i < sBuffer1.length(); i++){
if(i >= sBuffer2.length()){//handles difference in input string length
diffVal.append(sBuffer1.substring(i, sBuffer1.length()));
break;
}
if (sBuffer1.charAt(i) != sBuffer2.charAt(i)) {
diffVal.append(sBuffer1.charAt(i));
}
}
System.out.println(diffVal);// I am printing it here
the out put is : bbd
One recommendation here is use StringBuilder if you the strings you are using here are not required to be synchronized

Java: how do icheck if a certain character is within a string, then print out the position it is in relative to the string?

What I am trying to do, is create a method, that has a string and a character as parameters, the method then takes the string and searches for the given character. If the string contains that character, it returns an array of integers of where the character showed up. Here is what I have so far:
public class Sheet {
public static void main(String[] args) {
String string = "bbnnbb";
String complete = null;
//*******
for(int i = 0; i < string.length(); i++){
complete = StringSearch(string,'n').toString();
}
//********
}
public static int[] StringSearch(String string, char lookfor) {
int[]num = new int[string.length()];
for(int i = 0; i < num.length; i++){
if(string.charAt(i)== lookfor){
num[i] = i;
}
}
return num;
}
}
The method works fine, and returns this:
0
0
2
3
0
0
What I am trying to do, is make those into 1 string so it would look like this "002300".
Is there any possible way of doing this? I have tried to do it in the starred area of the code, but I have had no success.
just do
StringBuffer strBuff = new StringBuffer();
for(int i = 0; i<str.length(); i++)
{
if(str.charAt(i) == reqChar)
{
strBuff.append(str.charAt(i));
}
else
{
strBuff.append('0');
}
}
return str.toString();
Just add the result to the existing string with the += operator
String complete = "";
for(...)
complete += StringSearch(string,'n').toString();
I would just use java's regex library, that way it's more flexible (eg if you want to look for more than just a single character). Plus it's highly optimized.
StringBuilder positions = "";
Pattern pattern = Pattern.compile(string);
Matcher matcher = pattern.matcher(lookfor);
while(matcher.find()){
positions.append(matcher.start());
}
return positions;
Updated with StringBuilder for better practices.
public static String StringSearch(String string, char lookfor) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < string.length; i++){
if(string.charAt(i) == lookfor)
sb.append(i);
else
sb.append("0");
}
return sb.toString();
}
Then you can just call it once, without a for loop. Not sure why you call it for every character in the string.
complete = StringSearch(string,'n');

Finding characters in a string

i'm doing an encoding program where i'm supposed to delete every character in the string which appears twice. i've tried to traverse through the string but it hasn't worked. does anyone know how to do this? Thanks.
public static String encodeScrambledAlphabet(String str)
{
String newword = str;
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
newword += alphabet;
newword = newword.toUpperCase();
for (int i = 0, j = newword.length(); i < newword.length() && j >=0; i++,j--)
{
char one = newword.charAt(i);
char two = newword.charAt(j);
if (one == two)
{
newword = newword.replace(one, ' ');
}
}
newword = newword.replaceAll(" ", "");
return newword;
}
Assuming that you would like to keep only the first occurrence of the character, you can do this:
boolean seen[65536];
StringBuilder res = new StringBuilder();
str = str.toUpperCase();
for (char c : str.toCharArray()) {
if (!seen[c]) res.append(c);
seen[c] = true;
}
return res.toString();
The seen array contains flags, one per character, indicating that we've seen this character already. If your characters are all ASCII, you can shrink the seen array to 128.
Assuming by saying deleting characters that appears twice, you mean AAABB becomes AAA, below code should work for you.
static String removeDuplicate(String s) {
StringBuilder newString = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
String s1 = s.substring(i, i + 1);
// We need deep copy of original String.
String s2 = new String(s);
// Difference in size in two Strings gives you the number of
// occurences of that character.
if(s.length() - s2.replaceAll(s1, "").length() != 2)
newString.append(s1);
}
return newString.toString();
}
Efficiency of this code is arguable :) It might be better approach to count the number of occurences of character by a loop.
So, from the code that you've shown, it looks like you aren't comparing every character in the string. You are comparing the first and last, then the second and next to last. Example:
Here's your string:
THISISTHESTRINGSTRINGABCDEFGHIJKLMNOPQRSTUVWXYZ
First iteration, you will be comparing the T at the beginning, and the Z at the end.
Second iteration, you will be comparing the H and the Y.
Third: I and X
etc.
So the T a the beginning never gets compared to the rest of the characters.
I think a better way to do this would be to to do a double for loop:
int length = newword.length(); // This way the number of iterations doesn't change
for(i = 0; i < length; i++){
for(j = 0; j < length; j++){
if(i!=j){
if(newword.charAt(i) == newword.charAt(j)){
newword.replace(newword.charAt(i), ' ');
}
}
}
}
I'm sure that's not the most efficient algorithm for it, but it should get it done.
EDIT: Added an if statement in the middle, to handle i==j case.
EDIT AGAIN: Here's an almost identical post: function to remove duplicate characters in a string

Categories