我有一个项目 list ,表示为 Java 类。
例如
public class CheckList {
private boolean firstItem;
private boolean secondItem;
private boolean thirdItem;
public boolean isFirstItem() { return firstItem; }
public void setFirstItem(boolean firstItem) { this.firstItem = firstItem; }
public boolean isSecondItem() { return secondItem; }
public void setSecondItem(boolean secondItem) { this.secondItem = secondItem; }
public boolean isThirdItem() { return thirdItem; }
public void setThirdItem(boolean thirdItem) { this.thirdItem = thirdItem; }
}
现在我想“计算”检查 list 中的项目数的分数(百分比)。我的天真的做法是使用以下方法。
private static final int NR_OF_ITEMS = 3;
public double getScore() {
double score = 0;
if (firstItem) { score += 1; }
if (secondItem) { score += 1; }
if (thirdItem) { score += 1; }
return score / NR_OF_ITEMS;
}
然而,这在某种程度上是不切实际的,而且似乎很奇怪(特别是当 list 变得更长时)。另一种方法可能是拥有一个可以迭代的项目列表,但这确实意味着不能轻松地限制项目,而且它也有缺陷。
用 Java 表示 list 的好解决方案是什么?感谢您的想法。
最佳答案
我会采用第二种方法,即使用项目列表。如果您将列表包装在另一个类中并在插入时检查列表的大小,那么限制项目的数量会很容易。
示例:
class Item {
boolean checked;
String name;
}
class CheckList {
private final int maxItemsAllowed;
private final List<Item> items;
public CheckList( int maxItems ) {
maxItemsAllowed = maxItems;
items = new ArrayList<>( maxItemsAllowed );
}
public void addItem( Item i ) {
if( items.size() >= maxItemsAllowed ) {
throw new IllegalArgumentException("Maximum no. of allowed items (" + maxItemsAllowed + ") exeeded");
}
items.add( i );
}
}
您还想到了哪些其他“缺陷”?
更新:
为了限制可能的项目数量,您可以设置 Item
枚举和/或不提供公共(public)方法来操作项目列表。
为了处理重复项,请使用 Set<Item>
并取决于您想要如何控制项目的顺序,或者 TreeSet
具有适当的Comparator
或LinkedHashSet
修改了尺寸检查。
另一种方法可能是使用 Map<Item, Boolean>
并将标志存储在项目之外。
示例:
enum Item {
ITEM_1("Item no. 1"),
ITEM_2("A second item");
private final String name;
private Item( String name ) {
this.name = name;
}
public String getName() { return name; }
}
class CheckList {
private final int maxItemsAllowed;
private final Map<Item, Boolean> items; //make this a TreeMap or LinkedHashMap
//Constructor and other methods omitted for clarity
public void check(Item item, boolean checked ) {
if( !items.containsKey( item ) ) {
throw new IllegalArgumentException("unknown item");
}
items.put(item, checked); //note the autoboxing here
}
public double getScore() {
int countChecked = 0;
int countTotal = 0; //see explanation below
for( Boolean b : items.values() ) {
if( Boolean.TRUE.equals( b ) {
countChecked++;
}
countTotal++;
}
return (double)countChecked/countTotal;
}
}
那么为什么会有 countTotal
在 getScore()
方法?由于 map 允许空值,具体取决于 list 的实现和使用情况,因此列表中的某个项目可能标志(值)可能为空。如果是这种情况并且 null
并不意味着false
你可以检查b != null
并且仅增加 countTotal
如果这是真的,即它将是非空项的数量。
关于java - 用 Java 类表示带有分数的 list ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24885738/