1

我的问题是这样的:https ://stackoverflow.com/questions/20919343/php-getting-count-of-how-many-x-and-y-in-a-row-then-getting-other-data-和

但后来我想到了从 Android Part 做这项工作。所以我有 2 个从 php 生成的 JSONObjects。第一个对象具有“值”和“总”数组。第二个有“name”、“surname”和“number”以及更多的数组。现在我需要比较第二个 JSONObject 的数字和第一个的值。我尝试了一些循环,但它按预期创建了两倍。这是我的 onPostExecute 方法:

protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
         pDialog.dismiss();
         try {
             JSONObject jsonObj = new JSONObject(jsonStr);
             JSONObject jsonObj2 = new JSONObject(jsonStr);

             // Getting JSON Array node
             sonuc = jsonObj.getJSONArray(TAG_BASLIK);

             // looping through All Contacts
             for (int i = 0; i < sonuc.length(); i++) {
                 JSONObject c = sonuc.getJSONObject(i);

                  AdayNumara = c.getString(TAG_OY);
                  ToplamOy = c.getString(TAG_TOPLAM);

                 Log.i("Aday Numaraları", AdayNumara);
                 Log.i("Oy Sayısı", ToplamOy);



                 pie.addItem(AdayNumara,Float.valueOf(ToplamOy), pRenk.get(i));

                 adaylar = jsonObj2.getJSONArray(TAG_ADAYLAR);
                for(int j=0; j< adaylar.length(); j++){

                    JSONObject c2 = adaylar.getJSONObject(j);

                    String no = c2.getString(TAG_NO);
                    String ad = c2.getString(TAG_AD);
                    String soyad = c2.getString(TAG_SOYAD);
                    String resim = c2.getString(TAG_RESIM);



                    HashMap<String, String> aday = new HashMap<String, String>();

                    do{
                    aday.put(TAG_AD, ad);
                    aday.put(TAG_SOYAD, soyad);
                    aday.put(TAG_RESIM, resim);
                    aday.put(TAG_NO, no);
                    aday.put(TAG_TOPLAM, ToplamOy);

                    adayList.add(aday);} while(AdayNumara == no);
                    }

                     adapter=new LazyAdapter2(SecimSonuclari.this, adayList);        
                     lv.setAdapter(adapter);
              }



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


         }

代码可能有错误的方法,因为我是 Android 新手。

我现在得到的是列表视图中的价值。必须有 2。前两个在它们的数轴上具有相同的值,例如 1 和 1。第二对有另一个数字,比如说2。

4

3 回答 3

1

我发现了我的问题。使用“==”似乎是错误的。

if(AdayNumara.equals(no)){
                        aday.put(TAG_AD, ad);
                        aday.put(TAG_SOYAD, soyad);
                        aday.put(TAG_RESIM, resim);
                        aday.put(TAG_NO, no);
                        aday.put(TAG_TOPLAM, ToplamOy);

                        adayList.add(aday);

                    }
于 2014-01-05T15:23:03.783 回答
1

我在一岁时就知道这个问题,但无论如何......我需要比较两个JSONObject没有内部JSONObject/的值JSONArray。大多数 SO 解决方案都推荐 3-rd 方 java 库,这有点太重了。

首先,Android 的内置JSONObject 没有以任何明智的方式定义hashCode()equals()。我使用了一个带有JSONObject内部的包装类。

下面的函数被放置在一些实用程序类中,使用它们来定义hashCode()equals()是一个简单的练习。

public static int jsonHashCode(JSONObject j) {
    if (j == null) {
        return 0;
    }
    int res = 0;
    for (String s : new AsIterable<String>(j.keys())) {
        res += s.hashCode();
    }
    return res;
}
public static boolean comparesEqual(JSONObject x, JSONObject y, Collection<String>only, Collection<String>except) {
    Set<String> keys = keySet(x);
    keys.addAll(keySet(y));
    if (only != null) {
        keys.retainAll(only);
    }
    if (except != null) {
        keys.removeAll(except);
    }
    for (String s : keys) {
        Object a = null, b = null;
        try {
            a = x.get(s);
        } catch (JSONException e) {
        }
        try {
            b = x.get(s);
        } catch (JSONException e) {
        }
        if (a != null) {
            if (!a.equals(b)) {
                return false;
            }
        } else if (b != null) {
            if (!b.equals(a)) {
                return false;
            }
        }
    }
    return true;
}
public static Set<String> keySet(JSONObject j) {
    Set<String> res = new TreeSet<String>();
    for (String s : new AsIterable<String>(j.keys())) {
        res.add(s);
    }
    return res;
}

whereAsIterable让我们将for(:)循环与迭代器一起使用,并定义为:

public class AsIterable<T> implements Iterable<T> {
    private Iterator<T> iterator;
    public AsIterable(Iterator<T> iterator) {
        this.iterator = iterator;
    }
    public Iterator<T> iterator() {
        return iterator;
    }
}

欢迎您编写并发布此代码的递归版本,支持JSONObject/JSONArray值。

于 2015-07-31T11:56:44.460 回答
0

对于我的用例,我最终遍历了第一个 json 对象的键,并检查了该值是否与第二个 json 对象中的值匹配。

            JSONObject obj = new JSONObject("some json string");
            JSONObject comparison = new JSONObject("some other json string with the same data but different key order");

            boolean equal = true;
            for (Iterator<String> iterator = obj.keys(); iterator.hasNext(); ) {
                String curKey = iterator.next();
                if(!obj.getString(curKey).equals(comparison.getString(curKey))){
                    equal = false;
                    break;
                }
            }
            if(equal){
                // do the thing that i want to do if the two objs are equal
            }
于 2019-02-28T17:41:07.900 回答