2013-11-22 33 views
0

我有數據在以下格式卸下值

String [] data = new String[]{"-166444026 0 file 20130801", 
"-166444026 0 file 20130802", 
"-166444027 0 file 20130802"}; 

這些選項卡分隔字符串。 現在.. 所以我們有 鍵,值,類型,日期。

我想要的是保持列表中最新的唯一鍵。 因此,例如... 這個操作的輸出應該是...

["-166444026 0 file 20130802", 
"-166444027 0 file 20130802"]; 

因爲-166444026出現兩次,但一個我刪除有20130801日期和這其中有一個較後日期?

我寫的代碼..但這只是返回一切。(我認爲這是假設刪除..但它沒有..)?? ??

任何線索?

package org.random_scripts; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.json.simple.JSONObject; 

public class Regex { 
    private static boolean alreadyExists(Map<String, Long> dict, String key) { 
     if(dict.containsKey(key)) 
      return true; 
     return false; 
    } 
    private static void removeEdge(ArrayList<JSONObject>edgeList, String key) { 

     for(JSONObject edge:edgeList) { 
      if (edge.get("destination").equals(key)) 
       edge.remove(key); 
     } 
    } 

    public static void main(String[] args) { 

     String [] data = new String[]{"-166444026 0 file 20130801", 
            "-166444026 0 file 20130802", 
            "-166444026 0 file 20130802"}; 

     try { 
      String key = "185479485"; 
      JSONObject jsn = new JSONObject(); 
      jsn.put("source", key.toString()); 

      ArrayList<JSONObject> edges = new ArrayList<JSONObject>(); 
      Map<String, Long> tracker = new HashMap<String, Long>(); 
      for (int i=0; i < data.length; i++) { 
       String value = data[i]; 
       //edgeString+= value.toString()+","; 
       String[] typeChunks = value.toString().split("\t"); 

       String destination = typeChunks[0]; 
       Double reputation = Double.parseDouble(String.valueOf(typeChunks[1])); 
       System.out.println(tracker.values().toString()); 
       JSONObject edgeJson = new JSONObject(); 
       Long date = Long.valueOf(typeChunks[3]); 
       if(alreadyExists(tracker,destination)) { 
        Long prev_date = tracker.get(destination); 
        System.out.println(true); 
        if (date > prev_date) { 
         //remove edge 
         removeEdge(edges,destination); 
         System.out.println("edges are" + edges.toString()); 

        } 
       } 
       else { 
        tracker.put(destination, date); 

       } 


       edgeJson.put("destination", destination); 
       edgeJson.put("reputation", reputation); 
       edgeJson.put("type", typeChunks[2]); 
       edges.add(edgeJson); 

      } 
      jsn.put("edgelist", edges); 
      System.out.println(jsn.toJSONString()); 
      //context.write(NullWritable.get(), new Text(jsn.toJSONString())); 
      //edgeString = edgeString.substring(0,edgeString.length()-1); 
      //edgeString+="]"; 
      } 
      catch (Exception e) { 
       System.out.println("Exceptiom"); 
       //context.write(NullWritable.get(),new Text(s)); 
      } 




     } 

} 

回答

1

使用HashMap,則每行分配給在HashMap的關鍵。

HashMap將只保留最新分配的值,因此您可以根據日期決定是否要重新分配它。

如果您需要保留行的原始順序,您可以使用保留插入順序的LinkedHashMap

希望它有幫助。

1

用regexp搜索最後一個單詞,然後迭代數組?

String key = data[data.length - 1].replaceAll(".*\\s", ""); 
    for (int i = 0; i < data.length; i++) { 
     if (data[i].endsWith(key)) { 
      System.out.println(data[i]); 
     } 
    } 

日期:

-166444026 0 file 20130802 
-166444027 0 file 20130802