Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / November 2007

Tip: Looking for answers? Try searching our database.

Problems adding Objects to an ArrayList

Thread view: 
Marcel.luchi - 20 Nov 2007 13:31 GMT
Hi there, please can anyone help me?

Im having troubles when adding objects to an ArrayList.

This is the Code:

public ArrayList <Especie> parse (ArrayList <String> vec) {
            ArrayList <Especie> individuos = new ArrayList <Especie>
();
      int inter[] = new int [17];
      int vecsize = vec.size ();
                for (int i = 0; i < vecsize; i++) {
          String carac[] = vec.get (i).toString ().split (",") ;
          for (int j=0; j<17; j++) {
              inter[j] = Integer.parseInt (carac[j+1]);
          }
          individuos.add (new Especie (inter));
      }
      for(Especie e: individuos){
          for(int i=0; i<17; i++){
          }
      }
  return individuos;
  }

What happens is that the Objects Especie are being created correctly,
but when i add it to the ArrayList individuos,  the last created
Especie is added N times to the ArrayList.

I think the proplem is in the line
individuos.add(new Especie(inter));
but dun know what is wrong in it.

Tnx.

Marcel Luchi Marchi
Chris Dollin - 20 Nov 2007 14:00 GMT
> Hi there, please can anyone help me?
>
[quoted text clipped - 9 lines]
>                  for (int i = 0; i < vecsize; i++) {
>            String carac[] = vec.get (i).toString ().split (",") ;

Why not

   for (String elem: vec) {
       String [] carac = elem.split( "," );

>            for (int j=0; j<17; j++) {
>                inter[j] = Integer.parseInt (carac[j+1]);
>            }
>            individuos.add (new Especie (inter));

Each new `Especie` will have /the same/ `inter` array passed to it.

If all you do is copy the reference to the array, then they'll all
share the same array, so they'll all look like the most recent
update.

Signature

Chris "which of you is the /real/ 'inter'?" Dollin

Hewlett-Packard Limited registered office:                Cain Road, Bracknell,
registered no: 690597 England                                    Berks RG12 1HN

Patricia Shanahan - 20 Nov 2007 15:48 GMT
> Hi there, please can anyone help me?
>
[quoted text clipped - 28 lines]
> individuos.add(new Especie(inter));
> but dun know what is wrong in it.

There is nothing wrong with it. The problem is with the handling of
inter. You are adding distinct Especie references, but all instances are
created referencing the same instance of inter.

You first need to decide on the rules for the constructor parameter. Is
the caller allowed to change the contents of the array after the
constructor call?

If yes, then the Especie constructor needs to make its own copy of the
array contents before returning, e.g. by creating a new array and using
System.arraycopy.

If no, then the code you quoted should create a new array instance for
each Especie creation.

Patricia
Daniel Pitts - 20 Nov 2007 17:12 GMT
> Hi there, please can anyone help me?
>
[quoted text clipped - 32 lines]
>
> Marcel Luchi Marchi
Actually, it looks like you pass in the same inter object to all the
especie objects.
you need to have int inter[] = new int[17] inside your vectsize loop.

Other tips:
When posting code on usenet, try to keep tab size to between 2 and 4 spaces.
Array syntax is better expressed "int[] inter" in Java.

Unless you absolutely need to, don't declare return types or parameters
as ArrayList, or other specialized collections, use the most generic
interface that makes sense.

Also, use the for each construct when appropriate.

public List<Especie> parse(Collection<String> strings) {
  List<Especie> parsed = new ArrayList<Especie>(strings.size());
  for (String string: strings) {
    int[] values = new int[17];
    String[] tokens = string.split(",");
    for (int i = 0; i < 17; ++i) {
      values[i] = Integer.parseInt(tokens[i+1]);
    }
    parsed.add(new Especie(values));
  }
  return parsed;
}

Further design suggestions:

This assumes good form on your input. That is especially dangerous when
dealing with String input.  You might verify that string.split(",")
actually returns 18 tokens, or instead of passing in an int[], use a
List<Integer>, which allows for different sized inputs.

It might also make sense to put the parsing logic into Especie itself.
Create what is called a factory method:
class Especie {
  public static Especie parse(String string) {
    String[] tokens = string.split(",");
    if (tokens.length < 18) {
      throw new IllegalArgumentException("Not enough commas");
    }
    int[] values = new int[17];
    for (int i = 0; i < 17; ++i) {
      values[i] = Integer.parseInt(tokens[i+1]);
    }
    return new Especie(values);
  }
}

Then your other parse loop becomes:

public List<Especie> parse(Collection<String> strings) {
  List<Especie> parsed = new ArrayList<Especie>(strings.size());
  for (String string: strings) {
    parsed.add(Especie.parse(string));
  }
  return parsed;
}

Hope at least some of these suggestions help you out.
Signature

Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Roedy Green - 21 Nov 2007 04:04 GMT
On Tue, 20 Nov 2007 05:31:18 -0800 (PST), "Marcel.luchi"
<marcel.luchi@gmail.com> wrote, quoted or indirectly quoted someone
who said :

>  individuos.add (new Especie (inter));

the problem is type erasure.  Especie becomes Object at run time.
There in no constructor Object ( inter );

see http://mindprod.com/jgloss/generics.html

to create new objects of a variable type requires some fancy footwork,
e.g. by passing a class object and using newInstance or reflection.
Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

Daniel Pitts - 21 Nov 2007 04:22 GMT
> On Tue, 20 Nov 2007 05:31:18 -0800 (PST), "Marcel.luchi"
> <marcel.luchi@gmail.com> wrote, quoted or indirectly quoted someone
[quoted text clipped - 9 lines]
> to create new objects of a variable type requires some fancy footwork,
> e.g. by passing a class object and using newInstance or reflection.
Sorry Roedy, this time you've made a mistake.

Especie is a concrete type in the OPs code. It just doesn't look like it
because of his (her?) formatting.  Also, the stated problem was that it
appeared that the same object was in the list multiple times.

Signature

Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Roedy Green - 21 Nov 2007 11:35 GMT
On Tue, 20 Nov 2007 20:22:58 -0800, Daniel Pitts
<newsgroup.spamfilter@virtualinfinity.net> wrote, quoted or indirectly
quoted someone who said :

>Especie is a concrete type in the OPs code.

oops. Never mind.  It sounded like a placeholder name, which mislead
me.
Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

Daniel Pitts - 21 Nov 2007 19:20 GMT
> On Tue, 20 Nov 2007 20:22:58 -0800, Daniel Pitts
> <newsgroup.spamfilter@virtualinfinity.net> wrote, quoted or indirectly
[quoted text clipped - 4 lines]
> oops. Never mind.  It sounded like a placeholder name, which mislead
> me.
I was mislead briefly at first too. Style and naming do have an impact :-)

Signature

Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Lasse Reichstein Nielsen - 21 Nov 2007 06:08 GMT
>        int inter[] = new int [17];

Array created here. This happens only once.

>        int vecsize = vec.size ();
>                  for (int i = 0; i < vecsize; i++) {
>            String carac[] = vec.get (i).toString ().split (",") ;
>            for (int j=0; j<17; j++) {
>                inter[j] = Integer.parseInt (carac[j+1]);

Array updated for each loop iteration.

>            }
>            individuos.add (new Especie (inter));

Same array passed to all constructors. The array is changed
after the object is created.

>        }
...
> What happens is that the Objects Especie are being created correctly,
> but when i add it to the ArrayList individuos,  the last created
> Especie is added N times to the ArrayList.

Probably not. The Especie objects are different, but my guess is that
the Especie(int[]) constructor *stores* the int array.
Then the next iteration changes the values of that int array, and
alos passes it to a new constructor.

Try copying (e.g., cloning) the array in the constructor instead of
storing the original argument.

> I think the proplem is in the line
> individuos.add(new Especie(inter));
> but dun know what is wrong in it.

All that is wrong is that the "inter" array is the same array for all
calls. The data in it will eventually be the data set by the last
iteration.

/L
Signature

Lasse Reichstein Nielsen  -  lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
 'Faith without judgement merely degrades the spirit divine.'



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.