2014-01-05 77 views
0

我的問題是這樣的:https://stackoverflow.com/questions/20919343/php-getting-count-of-how-many-x-and-y-in-a-row-then-getting-other-data-of-x-and比較2和一個JSONObjects

但轉念一想從Android電子部分做的工作。所以我有2個從php生成的JSONObjects。第一個對象具有「值」和「總數」數組。第二個有「名字」,「姓氏」和「數字」以及更多的數組。現在我需要比較第二個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新手,代碼可能有錯誤的方法。

我現在得到的是在listview中的值。必須有2個。前兩個在他們的號碼行上具有相同的值,如1和1。第二對夫婦有另一個數字,讓我們說2。

回答

0

我發現我的問題。它似乎使用「==」是錯誤的。

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); 

        } 
0

我知道在一歲了這個問題,但無論如何... 我需要沒有內部JSONObject/JSONArray比較兩個JSONObject值。大多數SO解決方案推薦一個第三方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; 
} 

其中AsIterable讓我們使用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值。