1

私が持っているコードはたくさんありますが、関連するビットは次のとおりです。

スタブとしてサイズ 10 で作成した配列があります。どのサイズの配列を取得できるかは事前にわかりませんが、10 を超えることはできません。

    int[] arrTracker = new int[10];
    arrTracker = MyLibrary.SearchForABookISBN( true, AShelf, userParsedArr, aUserTitle );

    for ( int j = 0; j < 10; j++)
    {
        pln(AShelf[arrTracker[j]]);

    }

理論上の上記のコードでは、配列を取得したら、それをループして内容を表示します (基本的に、探している本が MyLibrary オブジェクト配列で見つかった場所になります。

「userParsedArr」は、ユーザーが入力した ISBN です。

public int[] SearchForABookISBN ( boolean aFlag, Book[] anArray, int[] AnISBN, String aTitle ) 
{
    //This one was difficult.

        int length = anArray.length;
        int[] AnotherArr = new int[0];
        int[] AnotherArrTemp = new int[0];
        int[] AnotherArrNew = new int[0];

        boolean UFoundMe = false;

        if ( aFlag == true )
        {
            for ( int i = 0; i < length; i++)
            {
                //Assume we find the ISBN


                if ( ( anArray[i].Title.equals(aTitle) ) )
                {
                    int counter = 0;
                    for ( int j = 0;  j < 9; j++)
                    {
                        if (anArray[i].ISBN[j] == AnISBN[j])
                        {
                            counter++;
                        }
                        else
                        {
                            UFoundMe = false;
                            break;
                        }
                        if ( counter == 9 )
                        {
                            UFoundMe = true;
                        }

                    }
                    if ( UFoundMe == true )
                    {

                        //Create our 'main' tracker at 1 + size of previous array.
                        AnotherArrNew = new int[1 + AnotherArr.length];
                        if ( AnotherArrTemp.length > 0 )
                        {
                            //Copy values into a temp array.
                            //Make a new temp array
                            for ( int m = 0; m < AnotherArr.length - 1; m++ )
                            {
                                AnotherArrNew[m] = AnotherArrTemp[m];
                            }       
                        }           
                        AnotherArrNew[(AnotherArrNew.length) - 1] = i;

                        AnotherArrTemp = new int[AnotherArrNew.length]; 
                        for ( int n = 0; n < AnotherArr.length; n++ )
                        {
                            AnotherArrTemp[n] = AnotherArrNew[n];
                        }                           

                        System.out.println(anArray[i]);
                    }

                }
            }
        }
        return AnotherArrNew;
  }
}

ここでの基本的な考え方は、いくつかの空の配列を作成し、本を見つけたら、1 サイズ大きい新しい配列を作成し、古い配列を捨てて、内容を一時配列に転送し、以前に作成したもののバックアップを慎重に作成することです。古い新しい配列を削除して大きくします。

おそらく、私は 10 冊の本を持っており、そのうちの 3 冊は同じタイトルと ISBN を持っているとします。私は 3 の配列を返すことを期待していますが、20 冊の本が与えられ、それらすべてが同じである場合はどうなるでしょうか。

MyLibrary.SearchForABookISBN( true, AShelf, userParsedArr, aUserTitle ).length は、取得している配列のサイズを事前に知らせるために機能しますか? したがって、宣言するだけです:

int aLength = MyLibrary.SearchForABookISBN( true, AShelf, userParsedArr, aUserTitle ).length
int[] arrTracker = new int[aLength];
4

2 に答える 2

0

Javaコレクションの力を利用して、コードをより高速で保守しやすくします。にISBNを追加しますBook

class Book {
  private String isbn;
  private String title;
  public Book(int isbn, String title) {
    this.isbn = isbn;
    this.title = title;
  }
  @Override
  public String toString() {
    return "Book [isbn=" + isbn + ", title=" + title + "]";
  }     
}

書籍の配列をに再編成できる場合はMap、一定時間でタイトルで検索できます。追加の利点として、コードはより読みやすく、保守しやすく、配列をコピーする必要はありません。

private static List<Book> search(Map<String, List<Book>> library, String title) { 
  return library.get(title); 
}  

使用方法は次のとおりです。

import static java.util.Arrays.asList;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public static void main(String[] args) {
    Map<String, List<Book>> library = new HashMap<>();
    library.put("a", asList(new Book("1", "a"), new Book("2", "a"))); 
    library.put("c", asList(new Book("3", "c")));
    System.out.println(search(library, "a"));
}

このnew HashMap<>()ビットは、試してみるのが楽しいかもしれないと思ったJava7コードです。HashMap<String, List<Book>>以前のバージョンに使用します。

于 2012-12-10T19:23:50.873 に答える
0

jlordo が提案するように:ArrayList<Integer>の代わりに単純に使用しint[]ます。インターフェイスを実装しているため、 、、およびおそらくList<T>のようなメソッドがあります。add(T element)remove(T Element)remove(int index)contains(T element)

ArrayList は実際には、容量が使い果たされるとサイズが変更される配列によってサポートされますが、それを使用するためにそれについて知る必要はありません;)

于 2012-12-10T18:38:19.000 に答える