是否有类似于ArrayList的Java类可以执行此操作?

时间:2012-10-10 04:54:16

标签: java arrays arraylist

我在编程时遇到过这个问题。

想象一下,我有一个包含两列的数据表。第一列有字符串,第二列有整数。

我希望能够将表的每一行存储到动态数组中。因此,数组的每个元素都需要包含一个字符串和一个整数。

以前,我通过将表的每一列拆分为两个单独的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);

9 个答案:

答案 0 :(得分:10)

只需创建简单的POJO类来保存行数据。不要忘记equalshashCode并且更喜欢不可变解决方案(没有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

中的字典

http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

答案 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包含从键到两个值的映射。