簡體   English   中英

如何從JSON數組中獲取隨機對象

[英]How to get random objects from a JSON array

此JSONAray:

"cows": [
    {
      "age": 972,
      "name": "Betty"
      "status": "publish",
      "sticky": "pregnant"
    },
    {
      "age": 977,
      "name"; "Kate"
      "status": "publish",
      "sticky": "heat"
    },
    {
      "age": 959,
      "name": "Julie"
      "site_age": 63178480,
      "sticky": "Nursing"
    },
    ...
 }

包含20個對象。 我想要的是:從20個對象中取出3個隨機對象。這三個對象中任何一個的年齡都不會是一個確定的數字,例如961。

目前,我正在做什么:

private void parseCowsReq(JSONObject array) {
         try {
             for (int i = 0; i < 3; i++) {
                 int randumNum = getRandomCow(array);
                 JSONObject jsonObject = array.getJSONObject(randumNum);
                 String cowName = jsonObject.getString("name");
                 String cowStatus = jsonObject.getString("status");
                 Log.d(TAG, "Cow name is " + cowName + "cow Status is " + cowStatus);
             }

         } catch (JSONException e) {
             e.printStackTrace();
         }
  }

  private int getRandomCow(JSONArray jsonArray) {
          int length = jsonArray.length();
          int[] array;
          array = new int[length-1];
          int rnd = new Random().nextInt(array.length);
          return array[rnd];
  }

此代碼存在問題。

  1. 我不知道如何確保在JSONObject jsonObject = array.getJSONObject(randumNum);行中獲取對象JSONObject jsonObject = array.getJSONObject(randumNum); 不會有961歲
  2. 隨機數始終為0

    請問您如何做到這一點?

您可以這樣做:

public ArrayList<Integer> getRandomObject(JSONArray jsonArray, int indexesWeeNeed){
    Random rn = new Random();
    Set<Integer> generated = new LinkedHashSet<>();
    while(generated.size() < indexesWeeNeed){
        int index = rn.nextInt(10);
        JSONObject jsonObject = (JSONObject) jsonArray.get(index);
        int age = jsonObject.getInt("age");
        if(age<961) {
            generated.add(index);
        }
    }
    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.addAll(generated);
    return arrayList;
}

首先,加載對象:

JSONArray array = /* your array */;

接下來,我們需要一種從JSONArray (實際上是List )中檢索3個唯一對象的方法。 讓我們重新整理json數組的索引,以免最終不必重復生成重復項:

public Stream<JSONObject> randomObjects(JSONArray array, int amount) {
    if (amount > array.size()) {
        //error out, null, return array, whatever you desire
        return array;
    }
    List<Integer> indexes = IntStream.range(0, array.size()).collect(Collectors.toList());
    //random, but less time generating them and keeping track of duplicates
    Collections.shuffle(indexes);
    Set<Integer> back = new HashSet<>();
    Iterator<Integer> itr = indexes.iterator();
    while (back.size() < amount && itr.hasNext()) {
        int val = itr.next();
        if (array.get(val).getInt("age") != 961) { //or any other predicates
            back.add(val);
        }
    }
    return back.stream().map(array::get);
}

使用此方法,我們可以從列表中選擇三個對象,並按我們希望的方式利用它們:

randomObjects(array, 3).map(o -> o.getInt("age")).forEach(System.out::println);
//972
//977
//952

當我說“或任何其他謂詞時,您也可以通過方法傳遞這些謂詞:

public Stream<JSONObject> randomObjects(..., Predicate<Integer> validObject) {
    //...
    int val = itr.next();
    if (validObject.test(val)) {
        back.add(val);
    }
    //...
}

這意味着您可以更改每個方法調用的黑名單:

Stream<JSONObject> random = randomObjects(array, 3, val -> array.get(val).getInt("age") != 961);

麻煩的是您打電話時
。隨機()nextInt(array.length);
array.length是您剛創建的新數組。 您需要在現有陣列上執行該功能:
隨機的()。nextInt(JSONArray),其中
以獲得非零的隨機數。

為了確保您沒有達到一定的年齡,我建議您分拆代碼,不要在for循環內調用getRandomCow(array)函數。 取回一頭母牛時,請檢查名稱是否匹配,檢查年齡,如果可行,請保留該名稱。 如果沒有得到另一頭牛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM