Hey, this is my first java program. I am trying to print my original list of ages, but I can not figure it out. Please help! I have part b and part c already done. Any help is appreciated

a) print original list of ages
b) number of occurrences of age 10
c) print list of ages removing age 10

import java.io.* ;

class BagofAges 
{

public static void main(String args[]) throws IOException
{

DataInputStream in=new DataInputStream(System.in);
int ages[]=new int[100];
int i=0,k=0,kcount=0;


do
{
System.out.print("enter the age of your next family member or -1 to terminate:" );
k= Integer.parseInt(in.readLine());



if(k==10)
{ 
kcount++; //counts the no of occurrence of age 10 and do not add it to the ages[] array
} 
else if (k!=-1) //saves all values in ages[] except for -1 and 10
{
ages[i++] =k;
}
}
while (k!=-1);


System.out.println("Number of age 10 occurrence:"+kcount);

System.out.println("List of Ages");
for(int z=0;z<i;z++)
{
System.out.println(ages[z]);
}

}
}

Dani AI

Generated

The reason the original list was lost in the first post is that the program never stored the entries that equal 10 while reading input. Record every input first, then produce whatever views you need (original list, count of 10s, filtered list). Using a dynamic collection avoids fixed-size-array bookkeeping and the common ArrayIndexOutOfBounds traps.

Here is a compact, modern approach (uses Scanner and ArrayList) that reads until -1, prints the original entries, counts 10s, and prints the list without 10s:

import java.util.*;

public class BagOfAges {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Integer> original = new ArrayList<>();

        while (true) {
            System.out.print("enter the age of your next family member or -1 to terminate: ");
            int n = sc.nextInt();
            if (n == -1) break;
            original.add(n);
        }

        System.out.println("Original list:");
        for (int age : original) System.out.println(age);

        long count10 = original.stream().filter(a -> a == 10).count();
        System.out.println("Number of age 10 occurrence: " + count10);

        System.out.println("List without 10s:");
        for (int age : original) if (age != 10) System.out.println(age);
    }
}

Troubleshooting notes: do not try to print inside the input loop (print after the loop finishes). If you stick with arrays, keep a separate counter of valid entries and copy/print only up to that count — copying the full 100 slots will show default zeros or cause index mistakes. Avoid using exceptions as normal control flow; fix loop bounds instead. Also, prefer Scanner over DataInputStream for console text input in modern Java.

Thanks to for the copy-suggestion and to for pointing out that the original list must include the 10s; those are the two ideas this solution combines but implemented in a simpler, less error-prone way for beginners.

Recommended Answers

All 11 Replies

Since you are modifying the original list you will need to make a copy of it.

Then to print the original ages use the copied version.

Do i make a copy of the original list using a for loop inside the do-while loop or outside? I tried to do it earlier, but I was unsuccessful.

There is a couple of ways to do it.

First would be iterating though the original list and placing the same values in the new list:

int[] a = new int[100]; //the array to modify
....
int[] orig = new int[a.length];
for(int i = 0; i < a.length; i++)
{
    orig[i] = a[i];
}
....

The other way it to use the System.arrayCopy method

int[] a = new int[100];
....
int[] orig = new int[a.length];

//arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
System.arraycopy(a, 0, orig, 0, a.length);

Hope that Helps

I'm going to try the first technique that you did and copy the original values. Do I print out copy inside the do while loop or outside of it for it to be successful?

There is a couple of ways to do it.

First would be iterating though the original list and placing the same values in the new list:

int[] a = new int[100]; //the array to modify
....
int[] orig = new int[a.length];
for(int i = 0; i < a.length; i++)
{
    orig[i] = a[i];
}
....

The other way it to use the System.arrayCopy method

int[] a = new int[100];
....
int[] orig = new int[a.length];

//arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
System.arraycopy(a, 0, orig, 0, a.length);

Hope that Helps

Where I placed the comments are my attempt, but I was unsuccessful. Do you mind helping me some more? I can't believe I'm having a hard time printing out a copy of the list!

import java.io.* ;

class BagofAges 
{

public static void main(String args[]) throws IOException
{

DataInputStream in=new DataInputStream(System.in);
int ages[]=new int[100];
int i=0,k=0,kcount=0;
int copy[]=new int[100];


do
 {
  System.out.print("enter the age of your next family member or -1 to terminate:" );
  k= Integer.parseInt(in.readLine());
 
// for (i=0;i<copy.length;i++)
 //{
 //ages[k] = copy[k];
 //}
  

 
if(k==10)
{ 
  kcount++; //counts the no of occurrence of age 10 and do not add it to the ages[] array
} 
else if (k!=-1) //saves all values in ages[] except for -1 and 10
{
  ages[i++] =k;
}
}
while (k!=-1);


//System.out.println("List of Ages");
//for(i = 0; i < copy.length; i++)
//{   
 //System.out.println(copy[i]);
//}

System.out.println("Number of age 10 occurrence:"+kcount);

System.out.println("List of Ages");
for(int z=0;z<i;z++)
{
  System.out.println(ages[z]);
}

}
}

Here is what I did

class BagofAges {

    public static void main(String args[]) throws IOException {

        DataInputStream in = new DataInputStream(System.in);
        int ages[] = new int[100];
        int i = 0, k = 0, kcount = 0;
        int copy[] = new int[ages.length]; //Make this ages.length that way you only have to change it once


        do {
            System.out.print("enter the age of your next family member or -1 to terminate:");
            k = Integer.parseInt(in.readLine());

            if (k == 10) {
                kcount++; //counts the no of occurrence of age 10 and do not add it to the ages[] array
            } else if (k != -1) //saves all values in ages[] except for -1 and 10
            {
                ages[i++] = k;
            }
        }
        while (k != -1);

        //-----------------------------
        //       MAKE A COPY
        //-----------------------------
        for (i = 0; i < copy.length; i++) {
            copy[i] = ages[i];
        }


        //-----------------------------
        //       LIST ORIGINAL
        //-----------------------------
        System.out.println("ORIGINAL LIST:");
        for(int z = 0; z < copy.length; z++) {
            System.out.print(copy[i]);
            if(z != copy.length-1) System.out.print(", "); //print a comma unless its the last one
        }
        System.out.println();//blank line;



        System.out.println("Number of age 10 occurrence:" + kcount);

        System.out.println("List of Ages");
        for (int z = 0; z < i; z++) {
            System.out.println(ages[z]);
        }

    }
}

Also note when you are looping through. Unless you have a full list (100 items) you are going to get an ArrayIndexOutOfBoundsException when trying to print out the values.

When I receive the "ArrayIndexOutOfBoundsException", do I need to do a try/catch?

That would be best, otherwise you program will die.:ooh:

The code above will still not print the actual original list if it contains 10s because you are never adding the 10s to the array at all.

You need to add every number to the array. Then loop and print it.
Then count your 10s and print the count.
Then print the list, skipping the entries that are 10 - your instructions don't say that you actually have to remove the values, just don't print them. If you do want to remove the 10s, set the element to 0 or -1 or something.

Do I use each printing method inside of my do-while loop for this to work or should I continue printing outside of the do-while loop?

Thanks for your help guys, I finally figured it out.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.