gpt4 book ai didi

java - 用 Java 类表示带有分数的 list

转载 作者:行者123 更新时间:2023-12-01 12:43:23 26 4
gpt4 key购买 nike

我有一个项目 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具有适当的ComparatorLinkedHashSet修改了尺寸检查。

另一种方法可能是使用 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;
}
}

那么为什么会有 countTotalgetScore()方法?由于 map 允许空值,具体取决于 list 的实现和使用情况,因此列表中的某个项目可能标志(值)可能为空。如果是这种情况并且 null并不意味着false你可以检查b != null并且仅增加 countTotal如果这是真的,即它将是非空项的数量。

关于java - 用 Java 类表示带有分数的 list ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24885738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com