有没有类似ArrayList的Java类可以做到这一点?

3

在编程中,我有时会遇到这个问题。

假设我有一个数据表格,其中有两列。第一列是字符串,第二列是整数。

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

以前,我通过将表格的每一列拆分为两个单独的ArrayList,然后当我想要添加一行时,我会在每个ArrayList上调用一次add()方法来完成这一操作。要删除,则需要在相同索引处同时在每个ArrayList上调用remove(index)方法。

但是,难道没有更好的方法吗? 我知道有像HashMap这样的类,但它们不允许重复的键。我正在寻找允许重复条目的解决方案。

我知道可以像这样做:

ArrayList<Object[]> myArray = new ArrayList<Object[]>();
myArray.add(new Object[]{"string", 123});

我不想每次从数组中取出元素时都要强制转换成字符串和整数,但这可能是唯一的方法,除非我自己创建一个。这看起来更加混乱,我宁愿使用两个ArrayList。

那么有没有像ArrayList这样的Java对象,可以像这样工作:

ArrayList<String, Integer> myArray = new ArrayList<String, Integer>();
myArray.add("string", 123);

请查看Guava的Table接口。 - Marc-Christian Schulze
9个回答

9

创建简单的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和元组。

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));
    }
}

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));

3

如果您确定整数或字符串中的任何一个值是唯一的,则地图是选项。然后,您可以将该唯一值作为键。如果对于您的情况不成立,则创建一个简单的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);

2

您需要创建一个包含int和String的类(例如Foo)。

然后,您可以创建一个Foo对象的ArrayList。

List<Foo> fooList = new ArrayList<Foo>();


1

2
该问题并未建议使用Map。原帖作者正在维护两个并行的ArrayLists。 - jahroy
1
好的,你最好去给其他答案点个踩并评论一下。 - MikeB
1
我认为创建一个POJO是一个更好的想法。但这肯定不值得被踩,因为它解决了问题,而且问题似乎有点像在寻找一个Map。 :) - Bhesh Gurung

0

HashMap 可能是你正在寻找的类,假设 "string" 对于不同的值是不同的。这里有关于 HashMap 的文档。

示例:

HashMap<String, Integer> tempMap = new HashMap<String, Integer>();
tempMap.put("string", 124);

如果您需要添加多个值,可以创建类似于 HashMap<String, ArrayList> 的数据结构。

0
使用Map来解决这个问题:
Map<String, Integer> map = new HashMap<String, Integer>();

例如:

map.put("string", 123);

2
你不是指新的Map吧? - Bhesh Gurung

0

你可以使用Google集合库Guava,其中有一个名为Multimap的Map。它是一种类似于Map的集合,但可以将多个值与单个键相关联。如果您使用相同的键但不同的值两次调用put(K, V),则Multimap将包含从该键到这两个值的映射。


或者更好的是,一个Guava Multimap。 - yshavit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接