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

标签 java oop architecture

我有一个项目 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/

相关文章:

java - apache procrun 启动服务失败

java - 在 Java 中使用枚举作为小型数据库的替代方案

JavaScript 原型(prototype)函数在构造对象中不可用

JavaScript 结构,正确的方式?

java - 服务器端和客户端使用不同的 WAR 并将它们部署在不同的应用程序服务器中的优点和缺点

java - 尝试以递归方式将自定义节点添加到 LinkedList 的末尾

java - 使用 org.apache.http.entity.StringEntity 时显然出现奇怪的编译错误。两个不同项目中的不同行为

JavaScript OOP 类和声明

用于 Raspberry Pi 上 JSON 服务器的 Python 库

architecture - 除了中断驱动架构还有其他模型吗?