0

私はリストを持っています:

List<BookDTO> bookList = libraryDTO.getBooks();

int bookCounter = 0;
for (BookDTO bookdto : bookList)
{
       if ((!errors.isEmpty() && !errors.containsKey("book[" + bookCounter + "].bookRefNo") || errors.isEmpty()) &&
           // do comparison for each record with other records in same list ) {

           errors.put("book[" + bookCounter + "].bookRefNo", messageSource.getMessage("bookRefNo.cannot.be.same", null, null));
        }

    bookCounter++;
    }

さて、比較チェックの方法がわかりません..基本的に、一致するレコード(同じ値を持つレコード)があれば、キーを取得する必要があります。

4

2 に答える 2

2

同じ値の本を 2 冊持っているとエラーが発生するのか (コードを見るとそう思われる)、それともカウント中にスキップしたいのかわかりません。

いずれにせよ、すべての要素のコレクション全体をループすることなく、キーを考慮しないデータ構造ではそれを行うことはできません (つまり、O(n^2)の複雑さ)。

セットのようなもっと適切なものを使用できますか?

List<BookDTO> bookList = libraryDTO.getBooks();
Set<BookDTO> bookSet = new HashSet<BookDTO>(bookList);

bookCounter = bookSet.size();

もちろん、これは とBookDTOが正しく実装されてequals(..)いることを前提としていますhashCode()。のようなソート済みセットを使用することもできますTreeSet<BookDTO>が、これはBookDTO implements Comparable<BookDTO>.

于 2012-05-29T15:58:46.120 に答える
0

わかりました、あなたの BookDTO には bookRefNo プロパティがあり、同じ bookRefNo を持つ複数の本を持ちたくないでしょう。

1 つの解決策は、 Setに重複する要素が含まれていないという事実に依存することです。そのため、ループ内で次のようなことができます。

Set<String> bookRefs = new HashSet<String>();
for (BookDTO bookdto : bookList)
{
    if (!bookRefs.add(bookDto.getBookRef()))
    {
        // if we are here we tried to insert the same bookRef more than once...
    }
}
于 2012-05-29T16:19:24.703 に答える