我有这个班级
class TimeSpentStats{
int manId;
String sessionId;
int userId;
Long timeStamp;
}
我有一个List,我想获得最小时间戳和最大值 从每个列表(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个属性? 如果我能做到这一点,任何想法?谢谢
答案 0 :(得分: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)获取特定组合的配对对象(只要它当然存在。)
以下是对类
class Pair{
public long minTime;
public long maxTime;
}
答案 1 :(得分:0)
如果三元组的元素是独立的,那么这就是组合学中的一个问题,就像其他任何东西一样:你需要找到所有的三元组。这是一个很好描述的问题,并且有Java可以处理的递归解决方案,当然,如果问题变大,你必须观察堆栈。如果三元素的元素依赖,那么生活就更容易了。 在任何情况下,蛮力方法都是显而易见的:迭代可比项目并将项目与最大值进行比较并将项目与min进行比较。记录最大值和最小值。 如果它们在一个对象中,那么你可以创建一个嵌套的HashMap,例如将manIds映射到(sessionIds的映射到(Userids到(max,min)的映射))其中max,min可能是包含max /的对象最小值或它们可能是价值本身 - 这取决于您和您需要什么。 这个映射将是这些实例化的类的静态成员,基本上你可以在创建对象时缓存maxen和min。不难看出这将如何进入构造函数。这会增加一些开销,因为问题会变得很大,但它会让你失去很多次迭代,所以这可能是值得的权衡。
答案 2 :(得分: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
是字符串类型。