2016-11-15 19 views
0

문자열을 생성하고 해당 문자열을 변경 가능한 배열에 추가하는 코드가 있습니다. 여기서 코드 :NSMutableArray에 중복 객체가있는 이유는 무엇입니까?

ExportBookData *abe = [[ExportBookData alloc] initWithCategory:@"ABE"]; 
    abe.builtFileList = [[NSMutableDictionary alloc] initWithCapacity: 2]; 
    abe.exportData = [NSMutableArray array]; 

     for(int i = 0; i < booksArray.count; i++) { 
     [tabString setString: @""]; // clear it... 
     [tabString appendString:[NSString stringWithFormat:@"%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t" 
           "%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\n", 

           [[booksArray objectAtIndex:i] sku], 
           [[booksArray objectAtIndex:i] title], 
           [[booksArray objectAtIndex:i] author], 
           [[booksArray objectAtIndex:i] illustrator], 
           [[booksArray objectAtIndex:i] price], 
           [(Books *)[booksArray objectAtIndex:i] quantity], 
           @"Book", // book type 
           [[booksArray objectAtIndex:i] bookDescription], 
           [[booksArray objectAtIndex:i] binding], 
           [[booksArray objectAtIndex:i] bookCondition], 
           [[booksArray objectAtIndex:i] pubName], 
           [[booksArray objectAtIndex:i]pubLocation ], 
           [[booksArray objectAtIndex:i] pubYear], 
           [[booksArray objectAtIndex:i] isbn], 
           [[booksArray objectAtIndex:i] primaryCatalog], 
           @"",@"", // seller catalogs secondary and third catalog entries (not used) 
           @"", // ABE category <----- TODO 
           [[booksArray objectAtIndex:i] keywords], 
           [[booksArray objectAtIndex:i] jacket], 
           [[booksArray objectAtIndex:i] edition], 
           [[booksArray objectAtIndex:i] printing], 
           [[booksArray objectAtIndex:i] signedBy], 
           [[booksArray objectAtIndex:i]volume], 
           [[booksArray objectAtIndex:i] bookSize], 
           @"" // image url 
           ]]; 

     NSLog(@"\n\ntabString: %@",tabString); 

     [abe.exportData addObject: tabString]; // add to array 

     NSLog(@"\n\nexportData: %@", abe.exportData); // <-------------- overwritten with last entry, so all entries are the same TODO 
    } 

booksArray는 CoreData 저장소를 판독함으로써 충전되어있는 NSMutableArray된다; exportData도 NSMutableArray입니다. booksArray의 데이터는 유효하며 개수는 2입니다. tabString의 데이터도 유효하며, booksArray의 올바른 행을 포함합니다. 라인

[abe.exportData addObject: tabString]; 

booksArray의 마지막 레코드의 중복을 가지고있다. 이 로그 방식의 출력입니다 : 내가보고 지금 몇 시간 동안 (SO 구글,) 보았다

---->booksArray.count: 2 

tabString: 120 Women Who Run With The Wolves: Myths And Stories Of The Wild Woman Archetype Clarissa Pinkola Estes  2.1 1 Book  Hardcover  Ballantine Books  1992 0345377443      Like New  (null)    

exportData: (
"120\tWomen Who Run With The Wolves: Myths And Stories Of The Wild Woman Archetype\tClarissa Pinkola Estes\t\t2.1\t1\tBook\t\tHardcover\t\tBallantine Books\t\t1992\t0345377443\t\t\t\t\t\tLike New\t\t(null)\t\t\t\t\n" 
) 

tabString: 121 Colossus: The Secrets Of Bletchley Park's Code-breaking Computers B. Jack Copeland  35 1 Book  Paperback (Reprint)  Oxford University Press, USA  2010 9780199578146      No Dust Jacket  (null)    

exportData: (
"121\tColossus: The Secrets Of Bletchley Park's Code-breaking Computers\tB. Jack Copeland\t\t35\t1\tBook\t\tPaperback (Reprint)\t\tOxford University Press, USA\t\t2010\t9780199578146\t\t\t\t\t\tNo Dust Jacket\t\t(null)\t\t\t\t\n", 
"121\tColossus: The Secrets Of Bletchley Park's Code-breaking Computers\tB. Jack Copeland\t\t35\t1\tBook\t\tPaperback (Reprint)\t\tOxford University Press, USA\t\t2010\t9780199578146\t\t\t\t\t\tNo Dust Jacket\t\t(null)\t\t\t\t\n" 
) 

, 그리고 내가 다른 질문의 답변에서 보는 것과 정확하게 모든 일을하고, 나는 돈 가능하게 이것을 일으킬 수있는 것을 보지 마라. 도움이 크게 감사 할 것입니다. SD

답변

2

tabString은 반복해서 사용하려고 시도한 NSMutableString 인 것으로 보입니다. 그건 작동하지 않습니다. 결국 동일한 가변 문자열을 배열에 여러 번 추가했습니다. stringWithFormat을 일반 로컬 NSString에 할당하면됩니다.

[booksArray objectAtIndex:i]을 계속해서 또 다시 호출합니까? 개체를 한 번 가져 오십시오. 더 나은 방법은 루프에서 빠른 열거를 사용하는 것입니다.

for (YourBookClass *book in booksArray) { 
    NSString *tabString = [NSString stringWithFormat:@"%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t" 
          "%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\t%@\n", 
     book.sku, 
     book.title, 
     // and all of the rest of the properties 
     ]]; 

    [abe.exportData addObject:tabString]; 
} 

값에 탭이나 개행 문자가 포함되어 있으면 코드에서 잘못된 CSV 파일을 생성합니다. 이러한 값은 따옴표로 묶어야합니다.

+0

안녕하세요 릭 ... 네, tabString 참으로 변경할 수 있습니다 ... 쥐! 내 원조에 다시 와줘서 고마워. SD – SpokaneDude