23

I have a situation, where I have to apply a criteria on an input array and reuturn another array as output which will have smaller size based upon the filtering criteria.

Now problem is I do not know the size of filtered results, so I can not initialize the array with specific value. And I do not want it to be large size will null values because I am using array.length; later on.

One way is to first loop the original input array and set a counter, and then make another loop with that counter length and initialize and fill this array[]. But is there anyway to do the job in just one loop?

0

5 Answers 5

40

You can't... an array's size is always fixed in Java. Typically instead of using an array, you'd use an implementation of List<T> here - usually ArrayList<T>, but with plenty of other alternatives available.

You can create an array from the list as a final step, of course - or just change the signature of the method to return a List<T> to start with.

Sign up to request clarification or add additional context in comments.

3 Comments

why would you prefer ArrayList to LinkedList in this situation?
@Roman: I just naturally reach for an ArrayList in general. LinkedList would be fine too... it's a more expensive in terms of memory, of course, but it doesn't require copying elements on expansion.
@Roman: See When to use LinkedList over ArrayList for discussion. That being said, your first inclination should be ArrayList.
3

Use LinkedList instead. Than, you can create an array if necessary.

3 Comments

ArrayList would probably be more appropriate
@Noel M: why? I think it wouldn't. We don't know the number of elements. So, with LinkedList every add (i.e. addLast) operation works in O(1) and do really a little job, while ArrayList will autoincrease its size several times and these're costly operations.
On the other hand, with a LinkedList you're creating a Node object for each element. You claim that expansion is a "costly" operation - it's only a matter of creating a new array and copying the existing elements (which can be a fast array copy). I don't think it's simple to say which is uniformly "better" for this situation.
3

Just return any kind of list. ArrayList will be fine, its not static.

    ArrayList<yourClass> list = new ArrayList<yourClass>();
for (yourClass item : yourArray) 
{
   list.add(item); 
}

Comments

0

Here is the code for you`r class . but this also contains lot of refactoring. Please add a for each rather than for. cheers :)

 static int isLeft(ArrayList<String> left, ArrayList<String> right)

    {
        int f = 0;
        for (int i = 0; i < left.size(); i++) {
            for (int j = 0; j < right.size(); j++)

            {
                if (left.get(i).charAt(0) == right.get(j).charAt(0)) {
                    System.out.println("Grammar is left recursive");
                    f = 1;
                }

            }
        }
        return f;

    }

    public static void main(String[] args) {
        // TODO code application logic here
        ArrayList<String> left = new ArrayList<String>();
        ArrayList<String> right = new ArrayList<String>();


        Scanner sc = new Scanner(System.in);
        System.out.println("enter no of prod");
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            System.out.println("enter left prod");
            String leftText = sc.next();
            left.add(leftText);
            System.out.println("enter right prod");
            String rightText = sc.next();
            right.add(rightText);
        }

        System.out.println("the productions are");
        for (int i = 0; i < n; i++) {
            System.out.println(left.get(i) + "->" + right.get(i));
        }
        int flag;
        flag = isLeft(left, right);
        if (flag == 1) {
            System.out.println("Removing left recursion");
        } else {
            System.out.println("No left recursion");
        }

    }

Comments

0

If you are using Java 8 or later, you can use Stream. This is an example of extracting only even numbers in int[].

static int[] evenFilter(int[] input) {
    return IntStream.of(input)
        .filter(i -> i % 2 == 0)
        .toArray();
}

public static void main(String args[]) throws IOException {
    int[] input = {3, 4, 22, 36, 49, 51};
    int[] output = evenFilter(input);
    System.out.println(Arrays.toString(output));
}

output:

[4, 22, 36]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.