문제
어쩌면 거기에는 방법이 있는지에 대해 알고 있-나는 그것을 의심하지만-그러나 나는 하려고 변환할 문자열의 배열을 배열의 개체입니다.여기에는 문제점:나는 파일을 읽기 명령줄에서.파일을 나타내는 여러 클래스가 다음과 같은 유형의 각각 자신의 데이터 필드가 있습니다.차량의 부모 등 모든 사람들을 따른다:차량,자동차,미국의 자동차,외국 자동차,트럭,자전거입니다.
나는 아무런 문제가 없 파일을 읽는 문자열로 배열입니다.그러나 내가 필요한 개체를 만들의 이러한 모든 유형에 저장하는 형식의 배열 차량[].예를 들어의 일부는 파일은 다음과 같습니다:
- 차
- 김 로빈슨 스탠리
- 2344 법정 드라이브
- (221)885-7777
- stackoverflow@overflow.com
- 미국의 자동차
- John Bunyon
- 1010 레인 바이너리
- (221)885-55643
- bgt.com
- 가변
- 에서 만들어트 디트로이트
- 식물 동맹
는 클래스 형식의 첫 번째 라인에 의해 따라,소유자의 이름,주소,전화번호,이메일 주소...각 유형에 있는 분야는 특정합니다.그렇게 외국의 자동차에서 이루어지지 디트로이트 메트로폴리탄 에어포트이러한 각각의 필드 표시 별도의 줄에서 파일입니다.그래서 내가 무슨 짓을 한 것은 읽기 전체 파일에 문자열로 배열입니다.그러나,나를 찾을 필요가 내에서 형식 문자열의 배열을 만들고,물체의 형식,그리고 그들을 저장에서 차량 배열입니다.나의 주요 문제는 각 데이터 분야가 별도의 줄에.어떻게 접근해야 하는 이 문제입니까?이것은 자바 코드입니다.
해결책
처음에는 데이터를 문자열 배열로 읽는 것이 좋습니다. 그런 다음 해당 배열을 반복해야하며 각 루프 ( "차량", "아메리칸 카"등)의 "첫 번째 줄"을 기반으로 배열의 후속 요소가 동일하게 속하는지 알 수 있습니다.
이와 같은 것 (블랭크를 직접 채울 수 있습니다) :
int i = 0;
ArrayList<vehicle> vehicles = new ArrayList();
while (i < data.length)
{
if (data[i].equalsIgnoreCase("vehicle"))
{
Vehicle vehicle = new Vehicle();
vehicle.setOwner(data[++i]);
...
vehicles.add(vehicle);
}
else if (data[i].equalsIgnoreCase("american car"))
{
...
}
i++;
}
다른 팁
질문은 불분명합니다. 파일을 구문 분석하고 각 줄의 단어를 사용하여 객체를 만드는 방법을 알고 싶습니까?
가짜:
Vehicle_ptr myVeh = null;
for each line in file
switch line
{
case vehicle: myVeh = new Vehicle();
case American Car : myVeh = new AmericanCar();
default:
if (line.startswithaninteger && (myVeh != NULL)) myVeh.address = line;
etcetc.
}
팁 : TextFile에서 TypeIndifiers를 사용합니다. 예 : 자동차 : Americancar 주소 : 12345 BLA ETCETC
또는 시리얼 라이저를 사용하십시오
지금 당장하는 것처럼 파일을 읽을 수 있지만 클래스 유형 인 문자열을 읽을 때 올바른 차량 유형의 인스턴스를 만듭니다. 그런 다음 파일의 다음 x 라인이 해당 특정 유형의 속성이므로 속성을 읽고 차량 인스턴스에 설정하는 것으로 보입니다. 그런 다음 차량 인스턴스로 차량 어레이에 추가 할 수 있습니다.
내가 사용하는 것 Factory 패턴 생성하는 어댑터가 있습니다.공장이 걸릴 것이 문자열(차량,미국의 자동차)및 어댑터이 걸릴 것이 문자열을 편안하고 현재 인덱스입니다.어댑터 될 것이 책임있는 어떻게 아는 것이 많은 지수를 읽고 반환 개(또는 인터페이스).
IAdapter adapter = AdapterFactory.Create( "American Car" );
Object concreteObject = adapter.Popluate( stringArray, currentIndex );
지금 있는 경우,제어 방법을 통해 데이터를 저장할 수 있습을 보길 원하는 표준 직렬화,심지어 JSON 도록,처리 더 쉽습니다.
나에게 필요한 것 같습니다 공장 패턴 입력에서 차량 유형 세트를 구축합니다. 공장은 하나의 자동차 사양이 시작되고 다른 하나는 끝나는 곳을 결정할 수 있습니다. 그런 다음 자동차의 필드 세트를 결정하고 자동차 유형을 결정합니다. 그런 다음 모든 관련 필드를 통과하여 적절한 생성자를 호출 할 수 있습니다.
이는 미국 자동차의 생성자가 관심있는 모든 필드를 지정한다는 것을 의미합니다. 유럽 자동차 생성자는 동일하게 수행합니다. 각 생성자는 주어진 내용을 주장 할 수 있으므로 자동차를 잘못 만들지 않습니다.
공장은 구문 분석 및 입력 분리 및 구축 할 내용을 결정합니다. 자동차 생성자의 각 유형 그 차 만, 적절한 어설 팅을 수행합니다.
공장은 생성 된 자동차 목록을 유지하고 완료되면 해당 목록 (미국/유럽/일본어)을 반환합니다.
의사 코드에서 :
whilst(!done) {
fields.add(fieldFromFile);
if (carSpecificationCompleted) {
type = getType(fields);
if (type == 'American') {
car = new AmericanCar(fields);
}
else if (type == 'European') {
car = new EuropeanCar(fields);
}
cars.add(car);
clearStoredFields();
}
}
전달되는 파일을 제어하고 있습니까? 그렇다면 XML을 사용하여 서식 한 다음 사용하여 구문 분석하는 것이 좋습니다. JDOM? 그것은 구문 분석 측면에서 당신의 삶을 더 쉽게 만들 것입니다. 예를 들어, 다음과 같은 모든 차량 항목을 포맷 할 수 있습니다.
<node type="vehicle>
<attributes location="detroit" color="red" />
</node>
또는 어떤 형식을 생각해냅니다. 이점은 차량 (또는 원하는대로) 만 읽거나 XPath 또는 기타 기술을 사용하여 원하는 정보를 효율적으로 가져 와서 적절한 데이터 유형에로드 할 수 있다는 것입니다.
파일 형식을 제어 할 수없는 경우이 조언을 무시하십시오.
선택이 있으면 파일 형식을 변경하십시오.
사용하여 객체를 직렬화 할 수 있습니다 xstream. 그런 다음 일부 값이 존재하는지 확인하지 않고 완전한 Java 객체를 저장하면됩니다.
나는 그것을 사용할 것이다 건축업자 공장 대신 여기에 패턴. 큰 차이는 없지만 매개 변수가 그의 예에서하는 것처럼 보이는 것처럼 매개 변수가 다를 때 조금 더 쉽습니다.