我正在开发一个比较许多随机变量的Android应用程序。
列“A”,例如有4个变量,列“B”有4个变量......等总共有5列。变量是一组5个数字中的随机变量。
现在我有100个if语句,如:
If (a1==b1)
{If (b1==c1)
我列出了所有可能的结果...... a1.equals b2等等......我开始重写它以使用||但我仍然会出现数千行代码,而且我经常会遇到错误。我在网上搜索过,但我一直没有结果。
我想我要找的东西就像......
If ((a1||a2||a3||a4)==(b1||b2||b3||b4))
{
//check if ==(c1||c2||c3||c4) etc...
}
Else
{
Do something...
}
每当我写这样的东西时,我一直都会遇到编译错误和崩溃。另外,我无法弄清楚如何检查(a1&& a2)==(b1 || b2)等等...
非常感谢任何帮助或建议,谢谢!
编辑:对于有类似问题的人,我发现“while and for loops”非常有帮助。这是一个帮助我澄清它的网站,我希望它也可以帮助你...... http://www.javaranch.com/drive/loop.html
答案 0 :(得分:1)
现在我有大约100个if语句
停在那儿。
这几乎永远没问题,在可能没有问题的极少数情况下,你知道就是这种情况
这个问题得到挫折的原因(我不同意,这个值得提出的问题)是因为太多的程序员在看了100个复杂if语句编写的代码之后已经眼睛流血了。这实际上是创伤后应激障碍的一件事。它实际上伤害我们。
如果你需要写那么多条件,那听起来像是一个严重的设计缺陷。在这种情况下,肯定存在,并且它是一个非常简单的,可以通过基本的数据结构和算法知识来解决。
每当您拥有大量相关数据项并且想要对它们执行重复操作时,通常需要某种集合,以及某种算法来处理集合。
听起来您需要Array
或ArrayList
某种其他类型的List
来存储您的所有值。然后,您可以编写一个算法,通过某种循环访问列表中的变量,并执行您需要的任何逻辑。
其他答案可能会提供有用的代码,但这不会解决根本问题。你最好自己想出一个解决方案。你可以做到这一点,并且你会做得更好!您需要更全面地考虑您的问题,然后(并且只有这样)缩小特定的解决方案方法。在编写任何代码之前解决纸上的问题。要非常清楚你需要做什么(不考虑如何实现它),然后一旦你有一个好的解决方案,尝试将其转换为代码。 一旦找到解决问题的方法,编写代码就应该很容易了!
我建议阅读数据结构和算法,因为听起来你对它们并不熟悉;它们是您工具带中的关键技能。你不需要成为一名专家,但你会发现编程的时间会更加容易。
你不是傻瓜,你只是缺乏经验。我们都开始在某个地方学习,所以不要因其他人的反应而气馁。
答案 1 :(得分:0)
查看您的示例,您仅限于以下个别支票
要么
if (a1==b1 || a1==c1 || b1== c1) {
//stuff
或者
//as with the complex example above, using else-if will stop
//subsequent checks running if a case has already been matched
if (a1==b1) {
//stuff
} else if (b1==c1) {
//stuff
Java不支持
等分组检查if ((a1||a2||a3||a4)==(b1||b2||b3||b4))
作为旁注:我同意azurefrog在撰写此文时添加的评论 - 也许您有一个设计缺陷,如果解决,可以降低此块的复杂性。
如果有某些原因你无法简化你的代码,也许你可以将自己局限于一个简单的循环(取决于你实际需要的逻辑,你的问题是不明确的),如下所示:
List<Integer> leftSide = new ArrayList<>(); //i don't know your data type
leftSide.add(a1);
leftSide.add(a2);
...
List<Integer> rightSide = new ArrayList<>();
rightSide.add(b1);
rightSide.add(b2);
...
for (Integer leftItem : leftSide) {
if (rightSide.contains(leftItem)) {
//stuff
}
}
答案 2 :(得分:0)
我建议使用HashSet来提高速度。 HashSet就像一个List。一个集合。但它只能包含唯一的密钥。我们创建一个HashSet并将(条件:左)值存储到集合中。然后我们创建另一个Collection并用(条件:右)数据填充它。在此之后,我们调用一个循环List的方法,并比较List中的当前数据是否在HashSet中。如果匹配,则返回true以确保它不需要继续(并循环遍历所有匹配)。 Lambda使您的代码更短,更好阅读。
Set<MyData> data = new HashSet<MyData>();
data.put(a1);
data.put(a2);
data.put(a3);
data.put(a4);
List<MyData> dataSecond = new ArrayList<MyData>();
datasecond.add(...);
containsData(datasceond, data);
boolean containsData(ArrayList<MyData> datas, Set<MyData> hashSet) {
// the for loops through the "Collection" containing the first datas and validate if those are in the second Collection HashSet.
for(MyData data : datas) if hashSet.contains(data) return true;
return false;
}
或作为Lambda(未经测试)
boolean containsDataAsLambda(List<MyData> list, Set<MyData> set) {
return list.stream().anyMatch(t -> set.contains(t));
}
为什么要使用HashSet而不是List?因为HashSet更快,没有索引并且只允许唯一条目。