2017-02-18 2 views
-4

Я работаю над Android-приложением, которое сравнивает множество случайных величин.Как построить сложные инструкции «if»

Столбец «A», например, имеет 4 переменные, столбец «B» имеет 4 переменные ... и т. Д. Всего имеется 5 столбцов. Переменные случайны из набора из 5 чисел.

Прямо сейчас у меня есть около 100, если заявления, которые, как:

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

+4

Шаг 1: Используйте 'if', а не' If'. –

+2

Непонятно из ваших примеров, что вы на самом деле спрашиваете. Можете ли вы привести более конкретный пример? –

+0

Я обычно использую, если ... Он автоматически капитализируется Если по какой-то причине ...: P – Oliver

ответ

1

прямо сейчас у меня есть около 100, если заявления

остановка прямо там.

Это почти никогда не хорошо, и в крайне редких случаях, когда может быть в порядке, вы будете знать, , что это так.

Причина, по которой этот вопрос получает downvotes (с которым я не согласен, этот вопрос заслуживает того, чтобы его задали) состоит в том, что слишком много программистов имели свои глаза, кровоточащие после того, как они просмотрели код, написанный с помощью 100-х сложных операторов if. Это практически ПТСР. Это физически болит нас.

Если вам необходимо написать много условий, это звучит как серьезный недостаток дизайна. В этом случае определенно есть, и это довольно простая задача, которая может быть решена с помощью основных структур данных и знаний алгоритмов.

Всякий раз, когда у вас есть большое количество связанных элементов данных, и вы хотите выполнять повторяющиеся действия над ними, вам обычно нужна какая-то коллекция и какой-то алгоритм для работы над коллекцией.

Звучит так, будто вам нужен Array или ArrayList другого типа List, чтобы сохранить все ваши значения. Затем вы можете написать алгоритм, который обращается к переменным в списке с каким-то циклом и выполняет любую логику, в которой вы нуждаетесь.

Другие ответы, скорее всего, предоставят код, который будет полезен, но это не решит основной вопрос. Лучше вы сами придумать решение. Вы можете это сделать, и вам будет намного лучше сделать это! Вам нужно больше думать о своей проблеме, а затем (и только потом) сузить конкретные методы решения. Решите проблему на бумаге, прежде чем писать какой-либо код. Будьте предельно ясны, что именно вам нужно делать (не задумываясь о том, как вы его реализуете), а затем, когда у вас есть хорошее решение, попробуйте перевести его в код. Написание кода, когда у вас есть решение проблемы, должно быть легкой частью!

Я рекомендую читать структуры данных и алгоритмы, поскольку это звучит так, будто вы не очень хорошо знакомы с ними; они являются критическим навыком в вашем инструменте. Вам не обязательно быть экспертом, но вы обнаружите, что вам будет намного легче программировать время, чем больше вы о них знаете.

Вы не глупы, вы просто неопытны. Мы все начинаем учиться где-то, так что не будьте слишком обескуражен ответами других.

+0

Я думаю, что список массивов может помочь, вот где я могу начать. Большинство моих «if» являются {if (a1 == 1) {a1 заданы фон ... drawable}, и поскольку, как сказал Ник ниже, вы не можете сказать a1 || a2 || b1 ect. Мне пришлось сделать много программных изменений фона. 100, а точнее, потому что у меня есть 5 столбцов с 4 объектами в каждой × 5 переменных. Поэтому я ограничен, если только нет способа проверить все, и если (что-то == variable1) {установить фон ...}, это началось просто и за последние три месяца превратилось в бегемота, и именно поэтому я здесь. .. lol – Oliver

+1

Читайте дальше для петель. Всякий раз, когда вам нужно повторять поведение, вам нужен цикл. Кроме того, добро пожаловать в Stack Exchange. Если вы чувствуете, что любой из ответов полностью отвечает на ваш вопрос, не забудьте нажать галочку и принять ее. – Airhead

+0

После того, как вы посмотрите на несколько сайтов, которые мне нравятся для кодирования, кажется, что для циклов, вероятно, сократится мой код до трети строк, которые у меня есть. Куриный обед победителя. :) Спасибо! – Oliver

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 
    } 
} 
0

Я бы рекомендовал использовать HashSet для достижения скорости. HashSet подобен списку. Коллекция. Но он может содержать только уникальные ключи. Мы создаем HashSet и сохраняем значения (условие: слева) в наборе. Затем мы создаем другую коллекцию и заполняем ее данными (условие: справа). После этого мы вызываем метод, который проходит через список и сравнивает, если текущие данные из списка находятся в HashSet. Если он совпадает, он возвращает true, чтобы убедиться, что он не должен продолжать (и пропустить все совпадения). Лямбда делает ваш код немного короче и лучше читается.

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; 
} 

или лямбда (не тестировалось)

boolean containsDataAsLambda(List<MyData> list, Set<MyData> set) { 
    return list.stream().anyMatch(t -> set.contains(t)); 
} 

Почему вы должны использовать HashSet вместо List? Поскольку HashSet работает быстрее, он не имеет индекса и допускает только уникальные записи.

Hash Set and Array List performances

+0

Если ОП не знает, что он может использовать цикл for и массив здесь, вы ожидаете, что он поймет реализацию «HashSet»? Или Лямбда? – Airhead

+0

Да. Так как он может использовать его как базовый, чтобы узнать разницу между Set и List. Он попросил решение, и это похоже на одно. –

+0

По иронии судьбы я читал о HashSets и слышал о массивах, я просто никогда не использовал их лично. Раньше я не строил ничего подобного. – Oliver

Смежные вопросы