2011-03-20 21 views
0

我想知道一種標記數組中值的方法,刪除重複項併合並Java中的一些數據如何在數組中標記重複項?

我保持地緣位置的記錄使用緯度,經度和說明這一個JSON陣列編碼如下:

[{"lon": 0.001, "lat": 0.001, "desc": test}, {"lon": 0.001, "lat": 0.001, "desc": test2}] 

我想能夠同時保持除去重複地緣位置數組的「desc」部分,例如

[{"lon": 0.001, "lat": 0.001, "desc": test, test2}] 

編輯: 這是我目前在做什麼:

//Store locPoints from server in JSONArray 
JSONArray jPointsArray = new JSONArray(serverData); 
List<JSONObject> jObjects = new ArrayList<JSONObject>(); 
List<JSONObject> seenObjects = new ArrayList<JSONObject>(); 

for(int i = 0; i < jPointsArray.length(); ++i) 
{ 
jObjects.add(jPointsArray.getJSONObject(i)); 
}   
for (JSONObject obj : jObjects) 
       { 
        //This always returns true 
        if (!seenObjects.contains(obj))// && !seenObjects.contains(obj.get("lon"))) 
        { 

         Log.i("Sucess", "Huzzah!"); 
         seenObjects.add(obj); 
        } 
        else 
        { 
         //merge the 'desc' field in 'obj' with the 'desc' field in 
         JSONObject original = (JSONObject)seenObjects.get(seenObjects.indexOf(obj)); 
         JSONObject update = obj; 
         original.put("desc", original.get("desc") + ", " + update.get("desc")); 
         seenObjects.get(seenObjects.indexOf(obj)).get("desc")); 

        } 
       } 
+0

那麼,什麼是你的問題?看起來你的問題已經解決了,不是嗎? – dmcnelis 2011-03-20 03:43:08

+0

@dmcnelis我一直在試圖把它分解成一個可行的例子,但不能把我的頭轉過來,所以希望我能得到一個更好的例子,例如,在Java中。 – nhunston 2011-03-20 03:44:18

回答

2

你可以這樣做:

//assuming that the array you are filtering is called 'myArray' 
List<Object> seenObjects = new ArrayList<Object>(); 
for (Object obj : myArray) { 
    if (! seenObjects.contains(obj)) { 
     seenObjects.add(obj); 
    } 
    else { 
     //merge the 'desc' field in 'obj' with the 'desc' field in 
     //'seenObjects.get(seenObjects.indexOf(obj))' 
    } 
} 

請注意,這隻會工作,如果對象你比較有equals()hashCode()的實現,你想做什麼(在你的情況下,t嘿應該只考慮'lat'和'lon'字段)。

更新:

下面是一些完整的示例代碼:

import java.util.ArrayList; 
import java.util.List; 

import org.json.simple.JSONObject; 
import org.json.simple.JSONValue; 

public class JsonMergeTest { 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public static void main(String[] args) { 
     List<Object> myArray = new ArrayList<Object>(); 
     myArray.add(MyJsonObject.parse("{\"lon\": 0.001, \"lat\": 0.001, \"desc\": \"test\"}")); 
     myArray.add(MyJsonObject.parse("{\"lon\": 0.001, \"lat\": 0.001, \"desc\": \"test2\"}")); 

     List seenObjects = new ArrayList<Object>(); 
     for (Object obj : myArray) { 
      if (! seenObjects.contains(obj)) { 
       seenObjects.add(obj); 
      } 
      else { 
       //merge the 'desc' field in 'obj' with the 'desc' field in the list 
       MyJsonObject original = (MyJsonObject)seenObjects.get(seenObjects.indexOf(obj)); 
       MyJsonObject update = (MyJsonObject)obj; 
       original.put("desc", original.get("desc") + ", " + update.get("desc")); 
      } 
     } 

     for (MyJsonObject obj : (List<MyJsonObject>)seenObjects) { 
      System.out.println(obj.toJSONString()); 
     } 
    } 

    private static class MyJsonObject extends JSONObject { 
     @Override 
     public boolean equals(Object obj) { 
      if (obj == null || ! (obj instanceof MyJsonObject) || ! this.containsKey("lat") || ! this.containsKey("lon")) { 
       return super.equals(obj); 
      } 
      MyJsonObject jsonObj = (MyJsonObject)obj; 
      return this.get("lat").equals(jsonObj.get("lat")) && this.get("lon").equals(jsonObj.get("lon")); 
     } 

     @Override 
     public int hashCode() { 
      if (! this.containsKey("lat") || ! this.containsKey("lon")) { 
       return super.hashCode(); 
      } 
      return this.get("lat").hashCode()^this.get("lon").hashCode(); 
     } 

     @SuppressWarnings("unchecked") 
     public static Object parse(String json) { 
      Object parsedJson = JSONValue.parse(json); 
      if (! (parsedJson instanceof JSONObject)) { 
       return parsedJson; 
      } 

      MyJsonObject result = new MyJsonObject(); 
      result.putAll((JSONObject)parsedJson); 
      return result; 
     } 
    } 
} 
+0

@aroth這看起來是我所需要的,我該如何使用seenObject.get(obj),因爲它是一個集合? – nhunston 2011-03-20 04:20:13

+0

您是對的,我更新了示例以使用List而不是Set,這可以更輕鬆地爲合併操作獲取原始對象。 – aroth 2011-03-20 04:29:14

+0

@aroth此刻這不適用於我我正在使用JSONObjects並使用此if語句 if(!seenObjects.contains(obj.get(「lat」))&&!seenObjects.contains(obj.get( 「lon」))) 但它總是返回true。 – nhunston 2011-03-20 05:09:12

2

您可以使用GSon。並按照步驟:

在Java中定義一個相當於POJO,映射JSON字符串

public class Location implements Comparable<Location> { 
    public String lon; 
    public String lat; 
    public String desc; 

    @Override 
    public String toString() { 
     return "<lon: " + lon +", lat: "+ lat +", desc: " + desc +">"; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return ((Location)obj).lon.equals(lon) && ((Location)obj).lat.equals(lat); 
    } 

    public int compareTo(Location obj) { 
     return ((Location)obj).lon.compareTo(lon) + ((Location)obj).lat.compareTo(lat); 
    } 


} 

2.編寫合併相似位置的代碼。 OK,今天是星期天,讓我們做吧:)

public static void main(String[] args){ 
     //Some test data 
    String s = "[" + 
      " {\"lon\": 0.001, \"lat\": 0.001, \"desc\": \"test\"}," + 
      " {\"lon\": 0.002, \"lat\": 0.001, \"desc\": \"test3\"}," + 
      " {\"lon\": 0.002, \"lat\": 0.005, \"desc\": \"test4\"}," + 
      " {\"lon\": 0.002, \"lat\": 0.001, \"desc\": \"test5\"}," + 
      " {\"lon\": 0.001, \"lat\": 0.001, \"desc\": \"test2\"}]"; 
    Gson gson = new Gson(); 
    Location[] al = gson.fromJson(s, Location[].class); 
    List<Location> tl = Arrays.asList(al); 

    //lets sort so that similar locations are grouped 
    Collections.sort(tl); 
    List<Location> fl = new ArrayList<Location>(); 
    Location current = null; 

    //merge! 
    for(Iterator<Location> it = tl.iterator(); it.hasNext();){ 
     current = current==null?it.next():current; 
     Location ltmp = null; 
     while(it.hasNext() && (ltmp = it.next()).equals(current)) 
      current.desc = current.desc + "," + ltmp.desc; 
     fl.add(current); 
     current = ltmp; 
    } 

     //convert back to JSON? 
    System.out.println(gson.toJson(fl)); 

} 

輸出

[{"lon":"0.002","lat":"0.005","desc":"test4"}, 
{"lon":"0.002","lat":"0.001","desc":"test3,test5"}, 
{"lon":"0.001","lat":"0.001","desc":"test,test2"}]