package processing.hashtag.analysis; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.security.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import common.TimeUtil; public class ProcessFrequencyRecencySocial { private String sampleDir; public ProcessFrequencyRecencySocial(String sampleDir, HashMap<String, HashMap<Integer, ArrayList<Long>>> userTagTime, HashMap<String, ArrayList<String>> network, Integer granularity) { this.sampleDir = sampleDir; ArrayList<Integer> durationSeconds = new ArrayList<Integer>(); ArrayList<Integer> durationMinutes = new ArrayList<Integer>(); ArrayList<Integer> durationHours = new ArrayList<Integer>(); ArrayList<Integer> durationDays = new ArrayList<Integer>(); for (String user : userTagTime.keySet()) { ArrayList<String> friends = network.get(user); ArrayList<HashMap<Integer, ArrayList<Long>>> friendHashMapList = new ArrayList<HashMap<Integer,ArrayList<Long>>>(); if (friends == null){ continue; } for (String friend : friends){ if (userTagTime.containsKey(friend)){ friendHashMapList.add(userTagTime.get(friend)); } } HashMap<Integer, ArrayList<Long>> allTagTimeMap = getAllTagsHashMap(friendHashMapList); if (granularity == null) { //durationSeconds.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.SECOND)); //durationMinutes.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.MINUTE)); durationHours.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.HOUR)); durationDays.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.DAY)); } else { if (granularity == TimeUtil.SECOND) { durationSeconds.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.SECOND)); } else if (granularity == TimeUtil.MINUTE) { durationMinutes.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.MINUTE)); } else if (granularity == TimeUtil.HOUR) { durationHours.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.HOUR)); } else if (granularity == TimeUtil.DAY) { durationDays.addAll(createDurationList(userTagTime.get(user), allTagTimeMap, TimeUtil.DAY)); } } } if (granularity == null) { //saveDurationList(durationSeconds, "social_recency_seconds.txt"); //saveDurationList(durationMinutes, "social_recency_minutes.txt"); saveDurationList(durationHours, "social_recency_hours.txt"); saveDurationList(durationDays, "social_recency_days.txt"); } else { if (granularity == TimeUtil.SECOND) { saveDurationList(durationSeconds, "social_recency_seconds.txt"); } else if (granularity == TimeUtil.MINUTE) { saveDurationList(durationMinutes, "social_recency_minutes.txt"); } else if (granularity == TimeUtil.HOUR) { saveDurationList(durationHours, "social_recency_hours.txt"); } else if (granularity == TimeUtil.DAY) { saveDurationList(durationDays, "social_recency_days.txt"); } } } private HashMap<Integer, ArrayList<Long>> getAllTagsHashMap(ArrayList<HashMap<Integer, ArrayList<Long>>> friendHashMapList){ HashMap<Integer, ArrayList<Long>> allTagTimeMap = new HashMap<Integer, ArrayList<Long>>(); for(HashMap<Integer, ArrayList<Long>> tagTimestampMap : friendHashMapList){ for (Integer tag : tagTimestampMap.keySet()){ ArrayList<Long> timestamps = tagTimestampMap.get(tag); if (allTagTimeMap.containsKey(tag)){ allTagTimeMap.get(tag).addAll(timestamps); }else{ allTagTimeMap.put(tag, new ArrayList<Long>()); allTagTimeMap.get(tag).addAll(timestamps); } } } return allTagTimeMap; } private ArrayList<Integer> createDurationList(HashMap<Integer, ArrayList<Long>> userTagTimeMap, HashMap<Integer, ArrayList<Long>> allTagTimeMap, int granularity){ ArrayList<Integer> durationList = new ArrayList<Integer>(); for (Integer tag : userTagTimeMap.keySet()){ ArrayList<Long> timestamps = userTagTimeMap.get(tag); Collections.sort(timestamps); Collections.reverse(timestamps); if (allTagTimeMap.containsKey(tag)){ ArrayList<Long> friendTimestampList = allTagTimeMap.get(tag); Collections.sort(friendTimestampList); Collections.reverse(friendTimestampList); for (Long timestamp : timestamps){ for (Long timestampFriend : friendTimestampList){ if(timestamp > timestampFriend){ int duration = (int)(timestamp - timestampFriend); int count = TimeUtil.getDurationAtGranularity(duration, granularity); count++; durationList.add(count); break; }else{ continue; } } } } } return durationList; } private void saveDurationList(ArrayList<Integer> durationList, String filename){ Collections.sort(durationList); File file = new File("./data/metrics/" + this.sampleDir + "/" + filename); if (!file.exists()){ try { file.createNewFile(); } catch (IOException e) { System.out.println("create a new file failed!!"); } } try { BufferedWriter fileWriter = new BufferedWriter(new FileWriter(file)); for (Integer duration : durationList){ fileWriter.write( duration + "\n"); } fileWriter.close(); } catch (IOException e) { System.out.println("Error! while creating a new file reader"); } } }