문제

어쩌면 거기에는 방법이 있는지에 대해 알고 있-나는 그것을 의심하지만-그러나 나는 하려고 변환할 문자열의 배열을 배열의 개체입니다.여기에는 문제점:나는 파일을 읽기 명령줄에서.파일을 나타내는 여러 클래스가 다음과 같은 유형의 각각 자신의 데이터 필드가 있습니다.차량의 부모 등 모든 사람들을 따른다:차량,자동차,미국의 자동차,외국 자동차,트럭,자전거입니다.

나는 아무런 문제가 없 파일을 읽는 문자열로 배열입니다.그러나 내가 필요한 개체를 만들의 이러한 모든 유형에 저장하는 형식의 배열 차량[].예를 들어의 일부는 파일은 다음과 같습니다:

  • 김 로빈슨 스탠리
  • 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 객체를 저장하면됩니다.

나는 그것을 사용할 것이다 건축업자 공장 대신 여기에 패턴. 큰 차이는 없지만 매개 변수가 그의 예에서하는 것처럼 보이는 것처럼 매개 변수가 다를 때 조금 더 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top