1

リスト内にリストを保持し、String型として宣言されたクラスがありますが、それが文字列であることはわかりません。

private ArrayList<List<String>> table;
table = new ArrayList<List<String>>();
table.add(new ArrayList<String>()); //is possible
table.add(new ArrayList<Integer>()); //not possible

しかし、ネストされたリストは文字列または整数のいずれかになります。どうすれば修正できますか?また、オブジェクトは文字列または整数でなければならないことを宣言できません

また、単一のArraylistは、オブジェクトとして宣言せずにintとstringの両方を保持できますか?

編集:あなたたちは正しい答えを議論しているようです。私がVikdorの答えを選んだ理由を洞察します。

私の仕事はcsvをロードし、ユーザーがコマンドを入力して各列を文字列または整数として定義することです。私のテーブルクラスにはプライベートインスタンス変数があり、値を追加するメソッドがあります。Vikdorの方法でそれを行うと、2つのテーブルをマージしたり、並べ替えたりする場合に、テーブルでの操作を非常に簡単に実行できます。また、ユーザーが例外を介して非文字列または整数を入力するのを防ぎます。

4

5 に答える 5

3

あなたはこれを探しているかもしれません:

List<List<? extends Object>> table;
table = new ArrayList<List<? extends Object>>();
table.add(new ArrayList<String>()); 
table.add(new ArrayList<Integer>()); 

これにより、次のように内部リストを取得するときにチェックされていないコードが生成されます(これは明らかに本番コードでは推奨されません)。

List<String> stringList = (List<String>) table.get(0); // Unchecked cast.

OPのコメントから:

それはintまたはstringのいずれかとしてそれを持っているという私の要件だからです。それ以外の場合は、それらのタイプより多くをリストに入れることができます。ネストされたリストは列のテーブルの値を保持し、各列はintまたはstringを保持します。csvファイルを読み取ってテーブルに保存する他の動的な方法はありますか?

各列に適切なデータ型が関連付けられたPOJOに直接解析される適切なCSVプロセッサ(SuperCSVなど)を使用することをお勧めします。

于 2012-11-03T04:48:42.620 に答える
1

単一のArraylistはintとstringsの両方を保持できます

以下の手順に従ってください

ステップ1:1つのクラスを作成する

import java.io.*;
public class TempClassArray 
{
    int numValue;
    String strValue;
    public TempClassArray(int numValue,String strValue)
     {
        this.numValue=numValue;
        this.strValue=strValue;
     }
}

ステップ2:同じ配列リストに整数と文字列を格納するために使用された同じディレクトリに別のクラスを作成します

import java.util.*;
public class mainClass 
{
    public static void main(String args[])
    {
        List<TempClassArray> sample=new ArrayList<TempClassArray>();
        sample.add(new TempClassArray(1,"One"));  //adding both integer and string values
        sample.add(new TempClassArray(2,"Two"));
        sample.add(new TempClassArray(3,"Three"));
        sample.add(new TempClassArray(4,"Four"));
        sample.add(new TempClassArray(5,"Five"));
        sample.add(new TempClassArray(6,"Six"));

        System.out.println("Integer \t\t String");
        System.out.println("********\t\t********");
        for(TempClassArray s:sample)
        {
            System.out.println(s.numValue+"\t\t\t"+s.strValue);
        }
    }
}

出力

Integer          String
********        ********
1           One
2           Two
3           Three
4           Four
5           Five
6           Six

このように、単一の配列リストに多くのデータ型と値を追加できます

ありがとうございました

于 2012-11-03T05:08:12.453 に答える
1

ジェネリックを整数または文字列として指定することはできません。両方を保存する必要がある場合は、共通の親であるObjectを使用する必要があります。

ハックは、すべての整数を文字列に変換することかもしれません。次に、instanceofをチェックする代わりに(Objectを使用している場合のように)コレクションからオブジェクトを取得するときに、文字列を整数に変換して、オブジェクトが弦。これは少し醜く、文字列が数値を保持している場合、文字列を整数として誤って解釈するという副作用があります。

package testapp;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author joefitz
 */
public class IntsAndStrings
{
    List<String> intsAndStrings = new ArrayList<String>();

    public void put(String val)
    {
        intsAndStrings.add(val);
    }

    public void put(Integer val)
    {
        intsAndStrings.add(String.valueOf(val));
    }

    public String getString(int index)
    {
        return intsAndStrings.get(index);
    }

    public int getInt(int index)
    {
        return Integer.parseInt(intsAndStrings.get(index));
    }

    public boolean isInteger(int index)
    {
        boolean retVal = false;

        try
        {
            Integer.parseInt(intsAndStrings.get(index));
            retVal = true;
        }
        catch(NumberFormatException e)
        {
        }
        return retVal;
    }    


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        IntsAndStrings testApp = new IntsAndStrings();
        testApp.put(1);
        testApp.put(2);
        testApp.put("hello");
        testApp.put("world");

        for (int i = 0; i < testApp.intsAndStrings.size(); i++)
        {
            if (testApp.isInteger(i))
            {
                int intVal = testApp.getInt(i);
                System.out.println("int:" + intVal);
            }
            else
            {
                System.out.println("String: " + testApp.getString(i));
            }
        }
    }    
}

実行結果:

int:1
int:2
String: hello
String: world
于 2012-11-03T05:17:54.003 に答える
0

文字列の代わりにオブジェクトを使用する必要があります。wthereインスタンスが文字列または整数であることを確認してください。

あなたがそうすることを望んでいるなら、あなたはそうすることができます

 ArrayList<List<String>> tableStr;
     ArrayList<List<Integer>> tableInt;



    tableStr = new ArrayList<List<String>>();
    tableInt = new ArrayList<List<Integer>>();

    tableStr.add(new ArrayList<String>()); 
    tableInt.add(new ArrayList<Integer>());
于 2012-11-03T04:43:08.517 に答える
0

あなたが使用することができます:

1) private ArrayList<List<Object>> table;


2) private ArrayList<List<Data>> table; 

//ここで、Dataは整数/文字列を使用して実装されたクラスです

3) private ArrayList<List<String>> table; 

//文字列は、変換する値を読み取る必要があるときはいつでも、int値も保持します。

于 2012-11-03T04:49:12.033 に答える