4

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

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

我希望能够将表的每一行存储到一个动态数组中。所以数组的每个元素都需要保存一个字符串和一个整数。

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

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

我知道可以做这样的事情:

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

我真的不想每次从数组中取出一个元素时都必须转换成 String 和 Integer 但也许这是不创建我自己的唯一方法?这对我来说看起来更令人困惑,我更喜欢使用两个 ArrayList。

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

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

9 回答 9

10

只需创建简单的 POJO 类来保存行数据。不要忘记equals并且hashCode更喜欢不可变的解决方案(没有设置器):

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 中的案例类和元组。

于 2012-10-10T04:56:57.950 回答
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));
    }
}
于 2012-10-10T05:01:57.530 回答
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);
于 2012-10-10T05:09:24.740 回答
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));
于 2012-10-10T05:01:45.197 回答
2

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

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

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

于 2012-10-10T05:01:29.760 回答
1

这叫做地图我的朋友。它类似于 .net 中的字典

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

于 2012-10-10T04:55:24.110 回答
0

HashMap我是你正在寻找的类,假设“字符串”对于不同的值会有所不同。这是关于HashMap的文档

例子:

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

如果您需要添加多个值,则可以HashMap<String, ArrayList>这样创建。

于 2012-10-10T04:55:27.010 回答
0

用于Map解决此问题:

Map<String, Integer> map = new HashMap<String, Integer>();

例如:

map.put("string", 123);
于 2012-10-10T04:55:59.260 回答
0

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

于 2012-10-10T04:56:54.200 回答