8

I need to create a List that records two columns {int, String}. I think ArrayList is what I need but I cant get my head around it. I pulled the Strings from a database and the int is the index value which I need to identify the strings position for later.

List<List<String>> strArray = ArrayList<List<String>>;

then could I do something like strArray.add().add() for each row I pull from the database?

tozhan
  • 413
  • 1
  • 7
  • 18

6 Answers6

16

I think you should use a HashMap with int as key and String as value if your int values are going to be unique.

Map<Integer,String> myMap = new HashMap<Integer,String>();
myMap.put(1,"ABC");

Note that as Map is a collections and java collections do not store primitive like int, they store objects so you have to use Integer wrapper class for your int values.

Refer this link Why can Java Collections not directly store Primitives types?

Community
  • 1
  • 1
Abubakkar
  • 15,488
  • 8
  • 55
  • 83
16

Another approach would be to make a custom object:

Class CustomObject {
    int value1;
    String value2;

    CustomObject(int v1, String v2) {
        value1 = v1;
        value2 = v2;
    }
}

And then use it:

List<CustomObject> myList = new ArrayList<CustomObject>();
CustomObject o1 = new CustomObject(1, "one");
myList.add(o1);
// etc.

If the int values are unique and you want to consider them keys, then a Map would work as others have suggested.

The111
  • 5,757
  • 4
  • 39
  • 55
7

If you need just two values you can use native Pair class

List<Pair> mPairs = new ArrayList<Pair>();

Pair pair = new Pair(123,"your string");
mPairs.add(pair);

This will be a good decision if you int values are not unique and so you can not use HashMap

k_shil
  • 2,108
  • 1
  • 20
  • 25
1

If your IDs are not unique, you still can use Map :

Map<Integer, String> map = new IdentityHashMap<Integer, String>();
map.put(new Integer(1), "string");

IdentityHashMap - use native hashCode implemetation for each OBJECT, so you don't need unique IDs, but you MUST create ALL Integers via operator 'new', and don't use autoboxing, because there is some cache mechanism.

Also there is JVM parameter, which controlls cache size '-XX:AutoBoxCacheMax='. But using this parameter you can't disable cache, if you set size to the zero, then cache will ignore it and use default: [-128; 127]. This parameter is only for Integers, there is no such kind of parameter for Long.

UPDATE Also for non unique keys you could use some sort of multimap: Map> map

And store in it your values with nonunique keys:

map.put(1, new ArrayList<String>());
map.get(1).add("value1");
map.get(1).add("value2");

You can use HashMap for that for example.

Also you can find MultiMap implementation in google-collections: 'guava'.

Community
  • 1
  • 1
kornero
  • 1,109
  • 8
  • 11
0

I think you may wrap the int and string in a class, then put the class objects in List.

TieDad
  • 9,143
  • 5
  • 32
  • 58
0

Map is an object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.

I think it would be better if you use Map<Integer,String> where key(Integer) would be the index which will pointing to String value.

Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"str1");
map.put(2,"str2");
...
Subhrajyoti Majumder
  • 40,646
  • 13
  • 77
  • 103