Home > Mobile >  Removing Multiple Elements from an array given a value
Removing Multiple Elements from an array given a value

Time:11-13

I'm trying to make a code that removes all the elements from the array that are equal to a given value. For example an array = [hi, hello, hi, bye] value = hi, it would given an output hello bye

Here's my code:

int count = 0;
for(int i=0; i<stringArr.length; 
        if(stringArr[i].equals(value)){
            count--;
            for(int j= i; j<stringArr.length-1; j  ){
                stringArr[j] = stringArr[j 1];
            }
            i--;
    }
}

Problem is instead of the expected output as: hello bye It gives an output of:

hello hi bye bye

CodePudding user response:

Try Java stream api:

String value = "hi";
String[] stringArr = new String[] {"hi", "hello", "hi", "bye"};
String[] results = Arrays.stream(stringArr)
                .filter(it -> !it.equalsIgnoreCase(value))
                .toArray(String[]::new);

CodePudding user response:

I don't recommend to do any manipulation to the original array, create a new one. Recycling is good for the planet, but may be very harmful in code. So if you want to stick to the Arrays only, then create a new array with and add all elements you want into the new array, but I think you can do better. Your approach is very "C" like, this is Java, you have a lot of better tools, than arrays.

One of them are streams and lambdas like this

@Test
public void example_lambdas() {
    String[] array = {"hi", "hello", "hi", "bye"};
    String[] result = Arrays.stream(array).filter(element -> !"hi".equals(element)).toArray(String[]::new);
    System.out.println(Arrays.toString(result));
}

Another option is to use list

@Test
public void example_list() {
    String[] array = {"hi", "hello", "hi", "bye"};
    List<String> list = new ArrayList<>(Arrays.asList(array));
    Set<String> toBeRemoved = Collections.singleton("hi");
    list.removeAll(toBeRemoved);
    String[] result = list.toArray(new String[0]);
    System.out.println(Arrays.toString(result));
}

CodePudding user response:

The problem is that you are shifting the values left but not decrementing the length of the array in the outer for.

Assign stringArr.length to count and use it in the for.

CodePudding user response:

Trading memory for speed, you could create a new array of the same length and only add in the first occurrence of what you want.

    String[] removeEqual(String[]array,String val){
       boolean found =false;
       String[]out=new String[array.length];
       int count=0;
       for (int i=0;i<array.length;i  ){
          if(array[i].equals(val)){
             if(!found){
                out[count  ]=val;
                found=true;
             }
             else out[count  ]=val;                     
          }
       }
       return Arrays.copyOf(out, count);
    }

You may like to consider separate functions for separate conditions such as removeLessThan and removeGreaterThan to keep it functionally coherent.

CodePudding user response:

Remove second loop because it get last data twice. stringArr[i].equals(value) then skip the matched value from array check ahead

Here down is my code:

String[] stringArr=new String[]{"hi", "hello", "hi", "bye"};
String  condition = "==";
String value = "hi";
for(int i = 0; i < stringArr.length; i  ){
   if (condition.equals("==")){
      if(stringArr[i].equals(value)){
          stringArr[i] = stringArr[i 1];
          System.out.print( stringArr[i]   " ");
      }
   }
}

Output:

hello bye 

CodePudding user response:

An array has a fixed size that cannot be changed. Hence your result cannot be a two element array when you start with a four element array. If you want the result to be a two element array, then you will need to create a second array. If, however, you want the result to stay in the original array, then I suggest setting the excess array elements to null. The following code demonstrates.

String[] stringArr = {"hi", "hello", "hi", "bye"};
String condition = "==";
String value = "hi";
int count = stringArr.length;
for (int i = 0; i < count; i  ) {
    if (condition.equals("==")) {
        if (stringArr[i].equals(value)) {
            count--;
            for (int j = i; j < stringArr.length - 1; j  ) {
                stringArr[j] = stringArr[j   1];
            }
            stringArr[stringArr.length - 1] = null;
        }
    }
}
System.out.println(java.util.Arrays.toString(stringArr));

The above code prints the following:

[hello, bye, null, null]

EDIT

As requested, below code creates a new array that only contains the requested elements, i.e. the ones that were not removed from the original array.

String[] stringArr = {"hi", "hello", "hi", "bye"};
String condition = "==";
String value = "hi";
String[] temp = new String[stringArr.length];
int count = 0;
for (int i = 0; i < stringArr.length; i  ) {
    if (condition.equals("==")) {
        if (!stringArr[i].equals(value)) {
            temp[count  ] = stringArr[i];
        }
    }
}
String[] result = new String[count];
for (int i = 0; i < count; i  ) {
    result[i] = temp[i];
}
System.out.println(Arrays.toString(result));

The above code prints the following:

[hello, bye]

In other words, result is a two element array.

Note that I assume that you only want to do array manipulation and you don't want to use classes in the JDK that most of the other answers have used.

  • Related