2014-10-13 5 views
0

у меня есть этот классПолучить минимум и максимум из списка объектов

class TimeSpentStats{ 
    int manId; 
    String sessionId; 
    int userId; 
    Long timeStamp; 
} 

У меня есть список, и я хочу, чтобы получить минимальную отметку времени и максимальной из списка для каждого (manId, SESSIONID, USERID)

Так, например, у меня есть:

manId SESSIONID идентификатор пользователя TIMESTAMP

1  01F  5   1000 
1  01F  5   1005 
3  6Y  3   7 
3  6Y  3   16 

мне нужно для (1 01F 5) -> мин = 1000, макс = 1005 и (3 6Y 3) -> мин = 7, макс = 16

мне нужно добавить, может быть, 2 атрибуты в том же самом класс? Любые идеи, если я могу это сделать? Спасибо

+0

Должно быть мин. 7? Как вы придумали 1000? – StackFlowed

+1

Я думаю, что он хочет их на основе «ключа» '(manId, sessionId, userId)' – MrHug

+0

Итак, для каждой тройки (manId, sessionId, userId) вы хотите узнать максимальное значение, которое появляется, и минимальное значение, которое появляется? –

ответ

0
public class Main 
{ 
    public static void main(String[] args) 
    { 
     Map< TimeSpentStats, MinMax > hashMap = new HashMap< TimeSpentStats, MinMax >(); 
     addToMap(hashMap, new TimeSpentStats(1, "01F", 5, 1000L)); 
     addToMap(hashMap, new TimeSpentStats(1, "01F", 5, 1005L)); 
     addToMap(hashMap, new TimeSpentStats(3, "6Y", 3, 7L)); 
     addToMap(hashMap, new TimeSpentStats(3, "6Y", 3, 16L)); 

     for (Map.Entry< TimeSpentStats, MinMax > entry : hashMap.entrySet()) 
     { 
      TimeSpentStats timeSpentStats = entry.getKey(); 
      MinMax minMax = entry.getValue(); 
      System.out.println(timeSpentStats.getManId() + "\t" + timeSpentStats.getSessionId() + "\t" + timeSpentStats.getUserId() + "\tMin Time Stamp :" + minMax.getMin() + "\tMax Time Stamp :" + minMax.getMax()); 
     } 
    } 

    private static void addToMap(Map< TimeSpentStats, MinMax > hashMap, TimeSpentStats timeSpentStats) 
    { 
     MinMax timeStampMinMax = hashMap.get(timeSpentStats); 
     if (timeStampMinMax != null) 
      timeStampMinMax.updateValues(timeSpentStats.getTimeStamp()); 
     else 
      hashMap.put(timeSpentStats, new MinMax(timeSpentStats.getTimeStamp())); 
    } 
} 

class MinMax 
{ 
    private Long min; 
    private Long max; 

    MinMax(Long timeStamp) 
    { 
     this.min = timeStamp; 
     this.max = timeStamp; 
    } 

    public Long getMin() 
    { 
     return min; 
    } 

    public Long getMax() 
    { 
     return max; 
    } 

    public boolean updateValues(Long timeStamp) 
    { 
     if (timeStamp < this.min) 
     { 
      this.min = timeStamp; 
      return true; 
     } 
     else if (timeStamp > this.max) 
     { 
      this.max = timeStamp; 
      return true; 
     } 

     return false; 
    } 
} 

class TimeSpentStats 
{ 
    private final int manId; 
    private final String sessionId; 
    private final int userId; 
    private final Long timeStamp; 

    public TimeSpentStats(int manId, String sessionId, int userId, Long timeStamp) 
    { 
     this.manId = manId; 
     this.sessionId = sessionId; 
     this.userId = userId; 
     this.timeStamp = timeStamp; 
    } 

    public int getManId() 
    { 
     return manId; 
    } 

    public String getSessionId() 
    { 
     return sessionId; 
    } 

    public int getUserId() 
    { 
     return userId; 
    } 

    public Long getTimeStamp() 
    { 
     return timeStamp; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (obj instanceof TimeSpentStats) 
     { 
      TimeSpentStats timeSpentStats = (TimeSpentStats)obj; 
      return this.manId == timeSpentStats.manId && this.sessionId.equals(timeSpentStats.sessionId) && this.userId == timeSpentStats.userId; 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() 
    { 
     return sessionId.hashCode(); 
    } 
} 

Edit: небольшая ошибка исправлена. Здесь я забыл использовать .equals(), так как упомянутый вами номер sessionId относится к типу String.

+1

должен добавить объяснение с вашим кодом ... предоставление кода просто не подходит для предоставления – kirti

0

Если элементы тройки независимы, то это проблема комбинаторики, как и все остальное: вам нужно найти все троек. Это довольно хорошо описанная проблема, и есть рекурсивные решения, которые может обрабатывать Java, хотя, конечно, вы должны смотреть стек, если проблема становится большой. Если элементы тройки зависят, то жизнь легче. В любом случае подход грубой силы очевиден: перебирайте сравнимые предметы и сравнивайте предмет с макс и сравнивайте предмет с минимумом. Запишите максимальный и мин. Если они находятся в объекте, вы можете создать вложенный HashMap, например, сопоставление manIds (сопоставление идентификаторов сеансов с (карты пользователей) (max, min)), где max, min может быть объектом, который содержит max/min, или они могут быть самими значениями - это зависит от вас и от того, что вам нужно. Эта карта будет статическим членом класса, который создает эти экземпляры, по сути, вы должны кэшировать maxen и mins по мере создания объектов. Не слишком сложно понять, как это будет в конструкторе. Это добавляет некоторые накладные расходы, поскольку проблема становится большой, но она избавляет вас от много итераций, поэтому это, вероятно, целесообразный компромисс.

3

Если у вас есть список TimeSpentStatus под названием , список, следующий алгоритм должен делать то, что вы хотите.

HashMap<String, Pair> statsList = new HashMap<String, Pair>(); 
for(TimeSpentStats stats : list){ 
    // Constructs the combination of IDs that is used as the key to a Pair object 
    String statsStr = stats.manId + " " + stats.sessionId + " " + stats.userId; 
    if(statsList.containsKey(statsStr)){ 
     // Update min and/or max time for the current combination as necessary 
     statsList.get(statsStr).minTime = Math.min(statsList.get(statsStr).minTime, stats.timeStamp); 
     statsList.get(statsStr).maxTime = Math.max(statsList.get(statsStr).maxTime, stats.timeStamp); 
    }else{ 
     // Construct a new Pair for the ID combination and add max and min times 
     Pair p = new Pair(); 
     p.maxTime = stats.timeStamp; 
     p.minTime = stats.timeStamp; 
     // Adds the new combination to the HashMap, which can now be updated in the if-statement 
     statsList.put(statsStr, p); 
    } 
} 

statsList теперь будет содержать максимум и минимум раз для каждой комбинации с (USERID + "" + manID + "" + SESSIONID) в качестве ключей. Затем вы сможете получить объект для определенной комбинации, используя statsList.get (userId + "" + manId + "" + sessionId) (при условии, что он существует, конечно).

здесь является PAIR класс

class Pair{ 
    public long minTime; 
    public long maxTime; 
} 
+0

Просто в стороне, нет никакой реальной причины написать собственный класс «Пара». Существует несколько реализаций, которые вы можете использовать, например ** org.apache.commons.math3.util.Pair **, ** org.apache.commons.lang3.tuple.Pair **, или вы даже можете просто использовать raw ** Map.Entry **. – azurefrog