0

我有这门课

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

我有一个列表,我想从列表中获取每个(manId、sessionId、userId)的最小时间戳和最大值

例如,我有:

manId sessionId userId timeStamp

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

我需要 (1 01F 5) -> min = 1000 , max = 1005 和 (3 6Y 3 ) -> min = 7 , max = 16

我需要在同一个类中添加 2 个属性?如果我能做到这一点,有什么想法吗?谢谢

4

3 回答 3

3

如果您有一个名为list的 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;
}
于 2014-10-13T15:23:11.190 回答
0

如果三元组的元素是独立的,那么这就是组合数学中的一个问题:你需要找到所有的三元组。这是一个很好描述的问题,Java 可以处理递归解决方案,当然,如果问题变大,您必须注意堆栈。如果三元组的元素是依赖的,那么生活会更轻松。无论如何,蛮力方法是显而易见的:迭代可比较的项目并将项目与最大值进行比较,并将项目与最小值进行比较。记录最大值和最小值。如果这些在一个对象中,那么您可以制作一个嵌套的 HashMap,例如将 manIds 映射到 (sessionIds 的映射到 (Userids 的映射到 (max,min))) 其中 max, min 可能是包含 max/最小值或它们本身可能是值 - 这取决于您和您的需要。该映射将是这些实例化的类的静态成员,本质上您将在创建对象时缓存 maxen 和 mins。不难看出这将如何进入构造函数。当问题变大时,这会增加一些开销,但它会为您节省大量迭代,因此这可能是一个值得权衡的选择。

于 2014-10-13T15:15:48.643 回答
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();
    }
}

编辑:修复了一个小错误。在这里我忘了使用.equals(),因为sessionId你提到的是 String 类型。

于 2014-10-13T15:58:03.400 回答