Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
rustock
8 / 8 / 2
Регистрация: 29.11.2010
Сообщений: 154
#1

В ступоре. Почему так? - Java SE

16.04.2013, 01:15. Просмотров 602. Ответов 6
Метки нет (Все метки)

Есть в классе метод, который выводит индекс элемента в строке. Элемент должен быть, либо +, либо -, либо выводит -1.

Собственно сам метод:

Java
1
2
3
4
5
6
7
8
9
10
11
    public int getSign1(String str)
    {
        int sign1;
        if(str.indexOf("+") < str.indexOf(")"))
            sign1 = str.indexOf("+");
        else if(str.indexOf("-", 2) < str.indexOf(")"))
            sign1 = str.indexOf("-", 2);
        else sign1 = -1;
        
        return sign1;
    }
Поиск осуществляется со второго элемента, так надо.
В классе таких методов 2. Для первой и для второй скобок.
На вход подается строка в виде (a+-b) знак действия(c+-d)
Вообщем, если знак +, то программа работает верно. Если же знак -, или * и в скобках одни минусы, то есть (a-b)-(c-d), или (a-b)*(c-d) метод возвращает значение -1.
непонятно, почему проходит (a-b)+(c-d), и по отдельности каждый минус при любом знаке, а эти 2 варианта не проходят.
Где ошибка? Что я упустил?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 01:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В ступоре. Почему так? (Java SE):

Почему так получилось?
Объясните пожалуйста, почему так получается? double d = 1000000e100; int...

Восх. преобразование(не пойму, почему так)
Вот, допустим такой код: class Super { int number = 0; int get() {...

java.lang.NullPointerException почему так?
вот код: private String stat; private int istat; ... ......

Почему ObjectMapper работает именно так
У меня есть класс типа JsonResponse в котором есть поле result типа Object....

Объясните почему работает именно так?
Добрый день. Пишу приложение и пытаюсь в меню добавить обработку метода ...

Простая програмка. Что не так? почему полностью не работает?
Когда запускаю программу, она работает до ввода choice, а после пытается...

6
mutagen
2564 / 2237 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.04.2013, 01:53 #2
Хорошо бы узнать ещё какова задача этого метода
1
rustock
8 / 8 / 2
Регистрация: 29.11.2010
Сообщений: 154
16.04.2013, 02:28  [ТС] #3
Цитата Сообщение от mutagen Посмотреть сообщение
Хорошо бы узнать ещё какова задача этого метода
Конкретно задача метода заключается в том, чтобы вывести индекс + или - в скобке. Между двумя числами. Если нет ни +, ни -, то вывести -1.
То есть, например, на входе (12345-54321)любой знак(321-5489).
метод1 ищет индекс первого минуса, метод 2 ищет индекс второго минуса.
Java
1
2
3
4
5
if(str.indexOf("+") < str.indexOf(")")) //если операция +, то переменная равна индексу +
            sign1 = str.indexOf("+");
        else if(str.indexOf("-", 2) < str.indexOf(")")) // если операция -, то переменная равна индексу -, счет идет с 2, потому что первое число может быть отрицательным
            sign1 = str.indexOf("-", 2);
        else sign1 = -1;
если этот любой знак это - или *, то почему-то метод1 возвращает -1, хотя метод2 работает всегда стабильно

Добавлено через 27 минут
Самое странное, что допустим, я на вход подаю строку (1-2)-(3-4), то
когда я вызываю метод для первой скобки, на выводе -1, когда я вызываю просто строку
str.indexOf("-", 2), выдает 2, str.indexOf(")") 4. Т.е. в методе условие 2 < 4 должно было пройти, но не прошло. Почему так?? :о
0
mutagen
2564 / 2237 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.04.2013, 03:03 #4
задача некорректна, нет логики обработки исключительных ситуаций
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
 *
 * @author mutagen
 */
public class SignIndex {
 
    public static void main(String[] args) {
        String[] valid = {"(12+123)", "(1-123)", "(1234*123)", "(123/123)"};
        for (String s : valid) {
            System.out.println(indexOfSign(s));
        }
        
//        вопрос как быть с такого рода случаями в вашем ТЗ?
        String[] invalid = {"(+12+123)", "((1-123)*-123)", "(1234*123", "((123/123)"};
    }
 
    public static int indexOfSign(String suspect) {
        int idx;
        if ((idx = indexOfSign(suspect, '+')) != -1) {
            return idx;
        }
        if ((idx = indexOfSign(suspect, '-')) != -1) {
            return idx;
        }
        if ((idx = indexOfSign(suspect, '*')) != -1) {
            return idx;
        }
        if ((idx = indexOfSign(suspect, '/')) != -1) {
            return idx;
        }
        return idx;
 
    }
 
    public static int indexOfSign(String suspect, char sign) {
        char[] tgt = suspect.toCharArray();
        for (int i = 0; i < tgt.length; i++) {
            if (tgt[i] == sign) {
                return i;
            }
        }
        return -1;
    }
}
1
rustock
8 / 8 / 2
Регистрация: 29.11.2010
Сообщений: 154
16.04.2013, 03:09  [ТС] #5
Цитата Сообщение от mutagen Посмотреть сообщение
задача некорректна, нет логики обработки исключительных ситуаций
исключительные ситуации уже обработаны в других методах. мне интересно, почему возникает такая ситуация, что если обращаться к методу, то он возвращает -1, а если вызвать indexOf, то он выдает верный результат. То ли лыжи не едут, то ли я ненормальный. Лыжи тут не причем, но причины такого парадокса, я так и не понял.
0
mutagen
2564 / 2237 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.04.2013, 03:18 #6
это не парадокс, просто ваш метод не делает того что вы описали в задаче, он делает какуюто левую логику с индексами скобок.
Или сформулируйте чётко задачу или не трогайте лыжи.

поругаю малёха:
1) где у вас вообще методы, я вижу только кусок кода ?
2) почему у вас на вход пролез код (1-2)-(3-4) если вы утверждаете что исключительные ситуации уже обработаны ?
3) какое отношение к знаку имеют скобки и их индекс и почему они должный участвовать в реализации ТЗ?
1
rustock
8 / 8 / 2
Регистрация: 29.11.2010
Сообщений: 154
16.04.2013, 18:05  [ТС] #7
Цитата Сообщение от mutagen Посмотреть сообщение
это не парадокс, просто ваш метод не делает того что вы описали в задаче, он делает какуюто левую логику с индексами скобок.
Или сформулируйте чётко задачу или не трогайте лыжи.
странно, что мой метод работает во всех случаях кроме двух. и еще более странно, что второй метод работает полностью.
Если углубиться в смысл задачи, то он такой: На вход подается строка в виде (a+-b*i) (знак +, -, * или /) (c+-d*i), где i - мнимая единица. На выходе должен быть результат действия с данными скобками. Все возможные исключения у меня уже написаны и лежат в отдельном классе. Все что мне остается, это знать, какой индекс у знака в скобках, и если он ни +, ни -, вывести -1. Т.е. пусть возьмем входную строку (1-2i)*(3+4i)

в первой скобке у нас минус, у него индекс 2, во второй скобке у нас +, у него индекс 9. именно эти 2 числа мне и нужны.

методы 1 и 2:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int getSign1(String str) //знак в первой скобке
    {
        int sign1;
        if(str.indexOf("+") < str.indexOf(")")) //если индекс  "+" меньше индекса ")" т.е. если на входе (a+bi). индекс "+" =  2, индекс ")"  = 5. 2 < 5. все верно 
            sign1 = str.indexOf("+"); 
        else if(str.indexOf("-", 2) < str.indexOf(")")) //тоже самое для минуса, если плюс не нашли. отчет с 2, в случае, если на входе (-a-bi)...
            sign1 = str.indexOf("-", 2);
        else sign1 = -1; 
        
        return sign1;
    }
    
    public int getSign2(String str) //знак во второй скобке
    {
        int sign2;
        if(str.lastIndexOf("+") > str.lastIndexOf("(")) // берем последний индекс "+". если он больше, чем последняя скобка "(", т.е. если на входе (a+bi)*(c+di). у последнего плюса индекс 9. последней скобки 7. 9 > 7. все верно 
            sign2 = str.lastIndexOf("+");
        else if(str.lastIndexOf("-") > str.lastIndexOf("(")) //тоже самое, для минуса, если плюс не нашли
            sign2 = str.lastIndexOf("-");
        else sign2 = -1;
        
        return sign2;
    }
надеюсь, что объяснил подробно.

Добавлено через 6 минут
Вообще, я считаю, что задача решается куда проще, но я сделал то, что первое пришло в голову, а делать все заново жалко)

Добавлено через 14 часов 19 минут
ошибка таилась в том, что, если на входе подается строка без + в-принципе, то метод выводит -1.

в getSign1 стоит заменить

Java
1
if(str.indexOf("+") < str.indexOf(")"))
на
Java
1
if(str.indexOf("+")!= -1 && str.indexOf("+") < str.indexOf(")"))
теперь все работает как надо.
0
16.04.2013, 18:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 18:05
Привет! Вот еще темы с решениями:

Почему ejbSelect так долго работает?!?
Подскажите пожалуйста, почему у меня некоторые ejbSelect так долго выполняются...

Магия Java или объясните, почему так
Здравствуйте, в процессе разработки, подбирая различный способы обработки...

Что не так с вызовом функции? Пишет ошибку, не могу понять почему
package g6_upr4_clas_test; class Test{ int a; Test (int i){ a...

Скажите почему например флешка на 4 ГБ а на ней ёмкость всего 3.73 ГБ почему это так?
Скажите почему например флешка на 4 ГБ а на ней ёмкость всего 3.73 ГБ почему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru