如何计算并仅返回 ArrayList 中为真的对象?
Posted
技术标签:
【中文标题】如何计算并仅返回 ArrayList 中为真的对象?【英文标题】:How do I count and return only the objects in my ArrayList that are true? 【发布时间】:2017-10-23 05:27:25 【问题描述】:我想计算所有为真的对象并返回它(正如我在 countNational 中尝试做的那样。我用来将对象分配为真/假的方法在不同的类中并命名为 NationalMessage。我已经粘贴了它位于 main 方法的下方。
public class Ex6
public static int countNational (ArrayList<Message> messageList)
int countTrue = 0; //will count those that are true
for (int i = 0; i<= messageList.size(); i++)
if(messageList.get(i)==true) //GETTING ERROR SAYING CAN'T COMPARE BOOLEAN
countTrue = countTrue + 1;
return countTrue;
public static void main(String[] args)
ArrayList<Message> messageList = new ArrayList<Message>();
messageList.add(new NationalMessage("UKJohn","UKMark","aa"));
messageList.add(new NationalMessage("UKJohn","FRJean","aa"));
messageList.add(new Message("Mike","John","aa"));
System.out.println(countNational(messageList));
****************************** 下面是来自一个名为 NATIONAL MESSAGE 的单独班级的方法********** *******************
public NationalMessage(String ssender, String rreceiver, String ccontent)
super(ssender,rreceiver,ccontent);
if (ssender.equals("UK") && rreceiver.equals("UK"))
isNational = true;
else
isNational = false;
【问题讨论】:
您要检查isNational
吗?换成if(messageList.get(i).isNational)
怎么样?
我们怎么知道Message
是真的还是假的?
您的代码有几个问题。 ssender
和 rreceiver
(无论第一个字母的重复点是什么……)不应该等于 "UK"
,而是从它开始。
我相信问题应该说How to return the count of true objects in an ArrayList
@dejvuth NationalMessage 方法在一个单独的类中,所以当尝试你建议的方法时,我一直收到一个错误,说找不到变量 isNational。我该如何解决这个问题?
【参考方案1】:
在 java8 中使用流就像过滤列表一样简单
long xx = myList.stream().filter(t -> t.isNational).collect(Collectors.counting());
或获取列表
List<NationalMessage> x = myList.stream().filter(t->t.isNational).collect(Collectors.toList());
【讨论】:
你不是说long count = ...count();
吗?
用于计数:myList.stream().filter(t->t.isNational).count()
或 myList.stream().filter(t->t.isNational).collect(Collectors.counting())
@StefanWarminski 作为标题也要求退货,现在是正确的。从列表中获取计数比从计数中获取列表更容易;)
@AxelH 方法的名称是 countNational
;) 听起来不像 getNationals
。但你是对的,这个想法应该很清楚。【参考方案2】:
变化:
if(messageList.get(i)==true)
到:
if(messageList.get(i).isNational==true)
为什么?
因为您可以将苹果与苹果、橙子与橙子进行比较。 在 == 的右侧,存在 true。所以在左侧也应该有一个布尔值或导致布尔值的表达式。 您的原始表达式 messageList.get(i) 不会产生布尔值。相反,它会导致一个对象或空值。 在某些语言(如 C)中,null 可能被解释为 false,而非 null 可能被解释为 true,但在 Java 中,情况并非如此。 您必须明确说明布尔值。 例如在您的情况下,左侧表达式可能是: messageList.get(i)!=null 这将评估为真/假
【讨论】:
"因为..." ;) 如果 OP 没有注意到这一点,可能需要解释一下。 我收到一条错误消息,提示“找不到变量 isNational”。 isNational 属于不同的类别。那么我将如何访问 isNational 呢? 您的课程 - Message 和 NationaMessage 是否都包含 isNational 或 NationaMessage 是否扩展了 Message?因为根据您的代码,您将它们都添加到列表中。 @Akshay 我有三门课。名为 Message 的超类(这不是我在上面分享的那个 - 我在上面分享的那个叫做 Ex6),一个叫做 NationalMessage 的 Message 的子类,以及 Ex6。我需要访问子类 NationalMessage 中的 isNational。如何访问子类中的变量?以上是关于如何计算并仅返回 ArrayList 中为真的对象?的主要内容,如果未能解决你的问题,请参考以下文章