2009-10-06 58 views
0

是否有一种简单的方法/库来检查和调整参数以保持在列表边界内?简化的Java列表边界检查

这里一个长的样品:

if (fromIndex < 0) { 
    fromIndex = 0; 
} 
if (fromIndex > list.size() - 1) { 
    fromIndex = list.size() - 1; 
} 

if (toIndex < 0) { 
    toIndex = 0; 
} 
if (toIndex > list.size() - 1) { 
    toIndex = list.size() - 1; 
} 

list.subList(fromIndex, toIndex); 

我知道我可以移动list.size() - 1到一个变量,并做在索引检查的提取物的方法,以除去冗余码。但对于这个简单的任务,它似乎仍有点冗长。

回答

5
public int sanitize(int index) { 
    return Math.max(0, Math.min(index, this.length-1)); 
} 
+0

小记:'list'或'listSize'也应该是参数 – naltatis 2009-10-06 12:31:02

+0

@tatilans:真,在这个片段中,看起来有点像上下文静态方法。然而,布赖恩建议包装一个现有的列表是一个更好的方式来实现这一点(更灵活,更少侵入,更少的样板代码),在这种情况下,“列表”可能是最终的成员领域。 – 2009-10-06 12:42:52

+0

好的。我将它改为this.length。如果它只是增加了更多的困惑,我会回滚:) – Zed 2009-10-06 12:57:10

3

如果你想检查所有访问到您的列表,在我看来,要在类内包装列表实现List接口和拦截访问的方法来检查/修改访问索引。

例如

List sanitised = new SanitisedList(existingList); 

这是Decorator模式的示例。请注意,您只需要定义一个类(SanitisedList),您可以将其应用于您拥有的任何列表。使用Zed's answer进行漂亮的边界检查。

0

您可以使用三元运算:

int listMax = list.size() - 1; 
list.subList(fromIndex < 0 ? 0 : (fromIndex > listMax) ? listMax : fromIndex, 
       toIndex < 0 ? 0 : (toIndex > listMax) ? listMax : toIndex);