我在编程时遇到过这个问题。
想象一下,我有一个包含两列的数据表。第一列有字符串,第二列有整数。
我希望能够将表的每一行存储到动态数组中。因此,数组的每个元素都需要包含一个字符串和一个整数。
以前,我通过将表的每一列拆分为两个单独的ArrayLists来实现这一点,然后当我想添加一行时,我会在每个ArrayList上调用add()方法一次。要删除,我会在同一索引的每个ArrayList上调用remove(index)方法一次。
但是,有没有更好的方法?我知道有类似HashMap的类,但它们不允许重复键。我正在寻找允许重复输入的内容。
我知道可以这样做:
ArrayList<Object[]> myArray = new ArrayList<Object[]>();
myArray.add(new Object[]{"string", 123});
每次我从数组中获取一个元素时,我真的不想要转换为String和Integer但是这可能是没有创建自己的唯一方法吗?这看起来更让我感到困惑,我更喜欢使用两个ArrayLists。
那么有没有像ArrayList这样的Java对象,它可以像这样工作:
ArrayList<String, Integer> myArray = new ArrayList<String, Integer>();
myArray.add("string", 123);
答案 0 :(得分:10)
只需创建简单的POJO类来保存行数据。不要忘记equals
和hashCode
并且更喜欢不可变解决方案(没有setter):
public class Pair {
private String key;
private Integer value;
public Pair(String key, Integer value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public Integer getValue() {
return value;
}
// autogenerated
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Pair)) return false;
Pair pair = (Pair) o;
if (key != null ? !key.equals(pair.key) : pair.key != null) return false;
if (value != null ? !value.equals(pair.value) : pair.value != null) return false;
return true;
}
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
}
用法:
List<Pair> list = new ArrayList<Pair>();
list.add(new Pair("string", 123));
注意:在其他语言中,有一些内置解决方案,如Scala中的case-classes和元组。
答案 1 :(得分:4)
创建一个包含数据的Row类。
package com.stackoverflow;
import java.util.ArrayList;
import java.util.List;
/**
* @author maba, 2012-10-10
*/
public class Row {
private int intValue;
private String stringValue;
public Row(String stringValue, int intValue) {
this.intValue = intValue;
this.stringValue = stringValue;
}
public int getIntValue() {
return intValue;
}
public String getStringValue() {
return stringValue;
}
public static void main(String[] args) {
List<Row> rows = new ArrayList<Row>();
rows.add(new Row("string", 123));
}
}
答案 2 :(得分:4)
如果您确定整数或字符串中的任何一个值是唯一的,则可以选择Map。然后,您可以将该唯一值作为键。如果您的情况不正确,创建一个简单的POJO是您的最佳选择。事实上,如果将来有机会每行获得更多的值(列),那么使用POJO也会耗费更少的时间。你可以定义POJO;
public class Data {
private int intValue;
private String strValue;
public int getIntValue() {
return intValue;
}
public void setIntValue(int newInt) {
this.intValue = newInt;
}
public String getStrValue() {
return strValue;
}
public void setStrValue(String newStr) {
this.strValue = newStr;
}
在课堂上你可以像使用它一样;
ArrayList<Data> dataList = new ArrayList<Data>();
Data data = new Data();
data.setIntValue(123);
data.setStrValue("string");
dataList.add(data);
答案 3 :(得分:3)
您可以创建非常简单的对象,例如:
public class Row{
private String strVal;
private Integer intVal;
public Row(String s, Integer i){
strVal = s;
intVal = i;
}
//getters and setters
}
然后按如下方式使用:
ArrayList<Row> myArray = new ArrayList<Row>();
myArray.add(new Row("string", 123));
答案 4 :(得分:2)
您应该创建一个包含int和String的类(例如Foo)。
然后您可以创建Foo对象的ArrayList。
List<Foo> fooList = new ArrayList<Foo>();
答案 5 :(得分:1)
这被称为地图我的朋友。它类似于.net
中的字典答案 6 :(得分:0)
HashMap
我是你正在寻找的班级,假设“字符串”因不同的值而不同。以下是HashMap
示例:
HashMap<String, Integer> tempMap = new HashMap<String, Integer>();
tempMap.put("string", 124);
如果您需要添加多个值,可以像这样创建HashMap<String, ArrayList>
。
答案 7 :(得分:0)
使用Map
解决此问题:
Map<String, Integer> map = new HashMap<String, Integer>();
<强>例如强>
map.put("string", 123);
答案 8 :(得分:0)
您可以使用google collection library Guava有一张名为Multimap的地图。它是类似于Map的集合,但可以将多个值与单个键相关联。如果您使用相同的键但不同的值调用put(K,V)两次,则multimap包含从键到两个值的映射。