2012-11-03 4 views
1

목록에있는 목록을 보유하고 있으며 형식 문자열로 선언 된 클래스가 있지만 더 이상 해당 문자열을 알 수 없습니다.알 수없는 데이터 형식 선언

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 및 문자열을 모두 보유 할 수 있습니까?

편집 : 옳은 대답을 논하는 것 같습니다. 왜 Vikdor 대답을 선택했는지 알 수 있습니다.

내 직업은 csv를로드 한 다음 command in user 형식을 사용하여 각 열을 string 또는 int로 정의하는 것입니다. 내 테이블 클래스에는 개인 인스턴스 변수가 있으며 값을 추가하는 메서드가 있습니다. Vikdor 방식으로 작업하면 테이블에서 작업을 수행하는 것이 매우 쉽습니다. 두 테이블 또는 정렬을 병합하고 싶습니다. 또한 사용자가 예외를 통해 비 문자열 또는 int를 입력하는 것을 방지합니다.

+0

가 왜'Object's 사용할 수 없습니다? – Austin

+0

int 또는 string 중 하나로 지정해야하기 때문에 필요합니다. 그렇지 않으면 목록에 이러한 유형을 추가 할 수 있습니다. 중첩 된 목록은 열의 테이블 값을 보유하고 각 열은 int 또는 string을 포함합니다. csv 파일을 읽고 표에 저장하는 다른 동적 방법이 있습니까? – RandomGuy

+0

CSV를 POJO로 구문 분석하는 라이브러리에 관심이 있는지 확실하지 않은 경우 (예 : http://supercsv.sourceforge.net/) – Vikdor

답변

2

을 할 wiling 경우 어느 당신은 그렇게 할 수 있습니다로,

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. 

From OP 's co mment :

int 또는 string 중 하나로 지정해야하기 때문에. 그렇지 않으면 목록에 이러한 유형을 추가 할 수 있습니다. 중첩 된 목록은 열의 테이블 값을 보유하고 각 열은 int 또는 string을 포함합니다. csv 파일을 읽고 표에 저장하는 다른 동적 방법이 있습니까?

적절한 CSV 프로세서 각 컬럼과 관련된 적절한 데이터 형식을 가진 POJO 직접 구문 분석 (SuperCSV 등)을 사용하는 것이 좋다.

+0

감사합니다. 나는 그것을 시도 할 것입니다. . – RandomGuy

+1

여전히 개체를 사용 중입니다 ... – dreamcrash

+0

Vikdor, 부당한 (오히려 잘못된 질문) 질문에 대해 합리적인 답변을 시도하고 있음을 알고 있지만 아무도이 작업을 수행해서는 안됩니다. 편집 : 명확히하기 위해, 내가 말하고자하는 것은이 문제에 접근하는 더 좋은 방법이 더 많은 세부 사항이 주어진다는 것입니다. –

0

String 대신 Object를 사용해야합니다. 젖은 인스턴스가 문자열인지 정수인지 확인하십시오.

당신은 당신이 찾고있는 수 있습니다

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>()); 
+0

나는 내가 객체를 사용할 수 없다고 말했고, Int 또는 문자열로 선언해야합니다 그렇지 않으면 두 개 이상을 수용 할 수 있습니다 – RandomGuy

0

당신은 사용할 수 있습니다

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


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

// 데이터가 정수/문자열

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

// 또한 INT 값을 보유 할 문자열, 지금 시간이 당신에 의해 구현 클래스입니다 당신은 당신이 개종 한 그 가치를 읽을 필요가있다.

1

하나의 ArrayList는 모두 int로 개최 문자열이 가능

아래의 단계

1 단계 : 생성 한 클래스

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

2 단계 : 같은 디렉토리에있는 다른 클래스를 작성하는 동일한 배열리스트에 정수 및 문자열을 저장하는 데 사용됩니다.

당신은 하나의 배열 목록에 많은 데이터 유형 및 값을 추가 할 수 있습니다이 같이 926,162,484,

출력

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

1

당신은 정수 나 문자열 같은 제네릭을 지정할 수 없습니다 감사합니다. 두 가지를 모두 저장해야하는 경우 공통 부모 인 Object를 사용해야합니다.

해킹은 모든 정수를 문자열로 변환하는 것일 수 있습니다. 그런 다음 Objectof를 확인하는 대신 컬렉션에서 객체를 가져올 때 (객체를 사용하는 것처럼) 문자열을 정수로 변환하고 객체가 null 인 경우 숫자 형식 예외를 catch 해 볼 수 있습니다. 끈. 이것은 약간 못 생기고 문자열에 숫자가 있으면 String을 정수로 오해하는 부작용이 있습니다.

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 
관련 문제