亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何在 Java 中比較兩個 JSONArray?

我如何在 Java 中比較兩個 JSONArray?

繁星淼淼 2023-03-31 09:40:08
我如何比較兩個 JSONArray,如果這兩個中的任何值匹配,函數必須返回true. 例如:array1=={1,2,3,4,5,6} array2=={9,10,11,1,12}當比較這兩個數組時,結果是true因為兩個數組之間至少有一個共同的元素。數組中的位置并不重要。我試圖通過一種原始的方式來比較它(遍歷每個數組并比較值)。private boolean compareArrays(JSONArray deviation, JSONArray deviationIds) throws JSONException {for (int i = 0; i < deviation.length(); i++) {for (int j = 0; j < deviationIds.length(); j++)if(deviation.getString(i).equals(deviationIds.getString(j)))    return true;}return false;}這段代碼有效,但我想知道是否有辦法讓我更專業地做到這一點。也許,通過使用 JAVA Stream API 來實現。如果您需要任何其他信息,請發表評論。謝謝??!
查看完整描述

3 回答

?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

如果要使用 JAVA Stream API,對象必須是 Iterable。正如@Michal 提到的,您可以將其更改為 Collection。從@Michal 的回答中,我們可以簡化它,就像:


public class JsonArrayIntersectTest {


    private boolean anyMatch(JSONArray first, JSONArray second) throws JSONException {

        Set<Object> firstAsSet = convertJSONArrayToSet(first);

        Set<Object> secondIdsAsSet = convertJSONArrayToSet(second);

        // use stream API anyMatch

        return firstAsSet.stream()

                .anyMatch(secondIdsAsSet::contains);

    }


    private Set<Object> convertJSONArrayToSet(JSONArray input) throws JSONException {

        Set<Object> retVal = new HashSet<>();

        for (int i = 0; i < input.length(); i++) {

            retVal.add(input.get(i));

        }

        return retVal;

    }


    @Test

    public void testCompareArrays() throws JSONException {

        JSONArray deviation = new JSONArray(ImmutableSet.of("1", "2", "3"));

        JSONArray deviationIds = new JSONArray(ImmutableSet.of("3", "4", "5"));


        Assert.assertTrue(anyMatch(deviation, deviationIds));


        deviation = new JSONArray(ImmutableSet.of("1", "2", "3"));

        deviationIds = new JSONArray(ImmutableSet.of("4", "5", "6"));


        Assert.assertFalse(anyMatch(deviation, deviationIds));


    }

}


查看完整回答
反對 回復 2023-03-31
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

任何匹配返回 true 的要求都可以重新表述為非空交集 return true。將JSONArrayinto轉換Collection為很容易做到這一點,例如像這樣


public class JsonArrayIntersectTest {


private boolean anyMatch(JSONArray first, JSONArray second) throws JSONException {

    Set<Object> firstAsSet = convertJSONArrayToSet(first);

    Set<Object> secondIdsAsSet = convertJSONArrayToSet(second);

    //Set<Object> intersection = Sets.intersection(firstAsSet, secondIdsAsSet);         // use this if you have Guava

    Set<Object> intersection = firstAsSet.stream()

            .distinct()

            .filter(secondIdsAsSet::contains)

            .collect(Collectors.toSet());

    return !intersection.isEmpty();

}


Set<Object> convertJSONArrayToSet(JSONArray input) throws JSONException {

    Set<Object> retVal = new HashSet<>();

    for (int i = 0; i < input.length(); i++) {

        retVal.add(input.get(i));

    }

    return retVal;

}


@Test

public void testCompareArrays() throws JSONException {

    JSONArray deviation = new JSONArray(ImmutableSet.of("1", "2", "3"));

    JSONArray deviationIds = new JSONArray(ImmutableSet.of("3", "4", "5"));


    Assert.assertTrue(anyMatch(deviation, deviationIds));


    deviation = new JSONArray(ImmutableSet.of("1", "2", "3"));

    deviationIds = new JSONArray(ImmutableSet.of("4", "5", "6"));


    Assert.assertFalse(anyMatch(deviation, deviationIds));


    }

}

但是,與直接使用 API 的初始版本相比,代碼要多得多JSONArray。它還會產生比直接 API 版本更多的迭代JSONArray,這可能是也可能不是問題。然而,總的來說,我認為在傳輸類型上實現領域邏輯并不是一個好的做法,例如JSONArray并且總是會轉換成領域模型。


另請注意,生產就緒代碼還會null對參數進行檢查。




查看完整回答
反對 回復 2023-03-31
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

您可以使用 XStream 來處理 JSON 映射

或者根據您檢索字符串的邏輯,您可以比較為

?JSONCompareResult?result?=?JSONCompare.compareJSON(json1,?json2,?JSONCompareMode.STRICT);
?System.out.println(result.toString());


查看完整回答
反對 回復 2023-03-31
  • 3 回答
  • 0 關注
  • 335 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號