-1

SDカードにjson配列を含むテキストファイルがあります。たとえば、ファイルは次のようになります。

[
{"CountryID" : "1","CountryName" : "Australia"},
{"CountryID" : "2","CountryName" : "Japan"},
{"CountryID" : "3","CountryName" : "China"},
{"CountryID" : "4","CountryName" : "India"},
{"CountryID" : "5","CountryName" : "Holland"}
]

ここで、国 ID に基づいてデータを取得したいと考えています。元。ID = 2 を渡したいのですが、取得できるオブジェクトは 1 つだけです。文字列変数でファイル全体をフェッチし、各オブジェクトをループしてデータを見つけることができます。しかし、それがベストプラクティスだとは思いません。私の実際のファイルには、ループしたくないオブジェクトが1000個以上ある可能性があるためです。

ありがとう

4

2 に答える 2

0

以下のコードサンプルを使用してタスクを実行できます

    Type listType = new TypeToken<List<Country>>() {}.getType();
    Gson gson = new Gson();
    String json = "["
            + "{\"CountryID\" : \"3\",\"CountryName\" : \"China\"},"
            + "{\"CountryID\" : \"2\",\"CountryName\" : \"Japan\"},"
            + "{\"CountryID\" : \"1\",\"CountryName\" : \"Australia\"},"
            + "{\"CountryID\" : \"4\",\"CountryName\" : \"India\"},"
            + "{\"CountryID\" : \"5\",\"CountryName\" : \"Holland\"}" 
            + "]";
    // parsing the JSON array
    ArrayList<Country> countries = gson.fromJson(json, listType);
    System.out.println(countries);

    // sorting the country list based on CountryID. Ensure list is sorted, since we do binary search next
    Collections.sort(countries);
    System.out.println(countries);

    Country searchKey = new Country(3,"");
    // searching for country with ID 3
    int index = Collections.binarySearch(countries, searchKey);
    if(index < 0 || index >= countries.size() ) System.out.println("Country with ID "+searchKey.getCountryID()+ " not found in results");
    else 
    {
        System.out.println("Found Country with ID : " + searchKey.getCountryID()+ " @ index : " + index);
        Country searchResult = countries.get(index);
        System.out.println("Searched result : "+searchResult);
    }
  • ここでは、GSONCountryを使用してリストを解析しています
  • このために、私はという名前のデータホルダークラスを使用していますCountry

クラスを見つけるCountry

public class Country implements Comparable<Country> {


    public Country(int countryID, String countryName) {
        super();
        CountryID = countryID;
        CountryName = countryName;
    }
    //"CountryID" : "1","CountryName" : "Australia"

    private int CountryID;
    private String CountryName;
    /**
     * Gets the countryID.
     * 
     * @return <tt> the countryID.</tt>
     */
    public int getCountryID() {
        return CountryID;
    }
    /**
     * Sets the countryID.
     *
     * @param countryID <tt> the countryID to set.</tt>
     */
    public void setCountryID(int countryID) {
        CountryID = countryID;
    }
    /**
     * Gets the countryName.
     * 
     * @return <tt> the countryName.</tt>
     */
    public String getCountryName() {
        return CountryName;
    }
    /**
     * Sets the countryName.
     *
     * @param countryName <tt> the countryName to set.</tt>
     */
    public void setCountryName(String countryName) {
        CountryName = countryName;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Country [CountryID=" + CountryID + ", CountryName="
                + CountryName + "]";
    }
    /* (non-Javadoc)
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(Country o) {
        // TODO Auto-generated method stub
        return this.getCountryID()-o.getCountryID();
    }


}
  • Countryクラスは、二分探索Comparableを行うためのインターフェースを実装しますCollections
  • Country解析が成功した後、リストをソートしました
  • 次に、binarySearchofCollectionsクラスを使用して、あなたのインデックスを見つけましたsearch-key-country
  • 返されたオブジェクトindexを取得するために使用しましたsearch-result-country
于 2012-07-20T12:24:36.970 に答える
0

1000 レコードになる場合は、代わりに sqllite を使用してください。Json はデータベース構造を意図したものではありません。

于 2012-07-20T07:18:42.593 に答える