4

プログラミング中に時々この問題に遭遇しました。

2 つの列を持つデータのテーブルがあるとします。最初の列には文字列があり、2 番目の列には整数があります。

テーブルの各行を動的配列に格納できるようにしたいと考えています。したがって、配列の各要素は文字列と整数を保持する必要があります。

以前は、テーブルの各列を 2 つの個別の ArrayList に分割するだけでこれを実現していました。行を追加する場合は、各 ArrayList で add() メソッドを 1 回呼び出します。削除するには、各 ArrayList の同じインデックスで remove(index) メソッドを 1 回呼び出します。

しかし、もっと良い方法はありませんか?HashMap のようなクラスがあることは知っていますが、それらは重複キーを許可しません。重複エントリを許可するものを探しています。

次のようなことが可能であることを知っています。

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

配列から要素を取得するたびに文字列と整数にキャストする必要はありませんが、独自の要素を作成せずにこれが唯一の方法でしょうか? これは私にとってより混乱しているように見えるので、2 つの ArrayList を使用することをお勧めします。

したがって、次のように機能する ArrayList のような Java オブジェクトはありますか。

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

9 に答える 9

10

行データを保持する単純な POJO クラスを作成するだけです。忘れないequalshashCode、不変のソリューションを優先してください(セッターなし):

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

整数または文字列のいずれかの値が一意であることが確実な場合は、マップがオプションです。次に、その一意の値をキーとして配置できます。あなたのケースに当てはまらない場合は、単純な 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 に答える
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 に答える
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

Google コレクション ライブラリ Guavaを使用できます。Multimap と呼ばれるマップがあります。Map に似たコレクションですが、複数の値を 1 つのキーに関連付けることができます。同じキーで異なる値を指定して put(K, V) を 2 回呼び出すと、マルチマップにはキーから両方の値へのマッピングが含まれます。

于 2012-10-10T04:56:54.200 に答える