Re: Problems adding Objects to an ArrayList
Marcel.luchi wrote:
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
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.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>