2013-11-26 1 views
0

Что я имею в виду, если у меня есть строка, такая как 23 + 4 + 13 = 40 или 123 - 100 + 245 = 268, как бы получить третью часть (c) из строки? В случае примеров я хочу получить 13 или 245 для использования.Вытягивание третьего номера из строки a + b + c = d

Как мне это сделать?

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

int first = Integer.parseInt(fileContent.substring(0, fileContent.indexOf(" "))); 
char operator = getOperator(fileContent); 
int second = secondNumber(result, fileContent); 
int last = Integer.parseInt(result.substring(result.indexOf("=") + 1)); 

Я не могу использовать массивы, регулярное выражение, try/catch или systemTokenizers для этого.

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

Это мой метод getOperator

public static char getOperator(String fileContent){ 


    int checkAdd = fileContent.indexOf('+'); 
    int checkMinus = fileContent.indexOf('-'); 
    int checkMulti = fileContent.indexOf('*'); 
    int checkDivi = fileContent.indexOf('/'); 

    if (checkAdd != -1){ 
     char operator = fileContent.charAt(fileContent.indexOf('+')); 
     return operator; 
    } 
    else if (checkMinus != -1) { 
     char operator = fileContent.charAt(fileContent.indexOf('-')); 
     return operator; 
    } 
    else if (checkMulti != -1) { 
     char operator = fileContent.charAt(fileContent.indexOf('*')); 
     return operator; 
    } 
    else if (checkDivi != -1){ 
     char operator = fileContent.charAt(fileContent.indexOf('/')); 
     return operator; 
    } 
    return ' '; 

и это мой метод второе число:

public static double secondNumber(String result, String opContent){ 

    int checkAdd = opContent.indexOf('+'); 
    int checkMinus = opContent.indexOf('-'); 
    int checkMulti = opContent.indexOf('*'); 
    int checkDivi = opContent.indexOf('/'); 

    if (checkAdd != -1){ 
     return Double.parseDouble(result.substring(result.indexOf('+')+1 , result.indexOf('='))); 
    } 
    else if (checkMinus != -1) { 
     return Double.parseDouble(result.substring(result.indexOf('-')+1 , result.indexOf('='))); 
    } 
    else if (checkMulti != -1) { 
     return Double.parseDouble(result.substring(result.indexOf('*')+1 , result.indexOf('='))); 
    } 
    else if (checkDivi != -1){ 
     return Double.parseDouble(result.substring(result.indexOf('/')+1 , result.indexOf('='))); 
    } 
    return 0; 
} 

результат приходит от этого метода:

public static String removeSpaces(String content){ 
    String result = content.replace(" ",""); 
    return result; 
} 
+0

Вы можете использовать «Сканер»? – kiruwka

+0

У вас есть конечный список всех возможных операторов (например, +, -, /, * и т. Д.)? если да, вы можете использовать регулярное выражение для разграничения строки в массив (список) конечным списком операторов. – amphibient

+1

Почему вы не можете использовать регулярные выражения или токенизаторы? это домашнее задание? – k2col

ответ

1

Хороший способ сделать это (в пределах ваших ограничений) заключается в использовании String.indexOf overload, который принимает fromIndex, а метод d о что-то подобное, но для операторов:

public static int getNextOperatorIndex(String fileContent, int startIndex) 
{ 
    for (int i = startIndex; i < fileContent.length(); i++) 
    { 
     if (fileContent.charAt(i) == '+' || 
      fileContent.charAt(i) == '-' || 
      fileContent.charAt(i) == '*' || 
      fileContent.charAt(i) == '/') 
      return i; 
    } 
    return -1; 
} 

С помощью этих двух методов, вы можете получить индексы, расколоть вашу строку, кроме:

int firstOperatorIndex = getNextOperatorIndex(fileContent, 0); 
int secondOperatorIndex = getNextOperatorIndex(fileContent,firstOperatorIndex+1); 
int equalsIndex = fileContent.indexOf("=", secondOperatorIndex); 

Поскольку это домашнее задание, я оставлю последний часть к вам:

//TODO: get a, b, c, d, and both operators based on those indexes 

Вы можете использовать String.trim() или replace (например, fileContent = fileContent.replace(" ", "");), чтобы легче устранить пробелы.

+0

У меня есть другой вопрос. Есть ли способ проверить, есть ли второй оператор, чтобы я мог идти между двумя (a + b = c) и тремя (a + b-c = d) проблемами? – CherryBomb95

+0

Да, если 'secondOperatorIndex'' -1, то второго оператора нет. –

0

Проблема состоит из 3 частей: токенизация, семантическая типизация и выбор. Токсинизация или лексический анализ собирает отдельные символы в значимые группы: пробелы, числа и операторы в вашей проблеме. Семантическая типизация распознает токены как значимые элементы выражения. Преобразование строки цифр в число, определяющее конкретную операцию. Если вы пишете компилятор выражения, они войдут в ваше абстрактное синтаксическое дерево (AST), но ваша проблема состоит в том, чтобы найти (выбрать) третий числовой элемент.

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

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

Подайте это в класс, который найдет третий номерный узел.

Учитывая ограничения на реализацию, это звучит как домашнее задание. Здесь достаточно, чтобы вы начали. Если это не домашнее задание, объясните, почему существуют ограничения.

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

0

Это делает много предположений, во-первых, вы можете реализовать свой собственный «токенизатор», во-вторых, если вы вызываете nextInt(), следующий токен должен быть int. Он делает то, что вы хотите, развлекайтесь, играя с ним, отлаживайте, смотрите, как он работает, понимайте алгоритм.

public static class PoorManTokenizer { 

    private String content; 

    public PoorManTokenizer(String fileContent) { 
     this.content = fileContent.trim(); 
    } 

    public char nextChar() { 
     return next().charAt(0); 
    } 

    public int nextInt() { 
     return Integer.parseInt(next()); 
    } 

    private String next() { 
     int indexOf = content.indexOf(" "); 
     if (indexOf == -1) { 
      indexOf = content.length(); 
     } 
     String substring = content.substring(0, indexOf); 
     content = content.substring(substring.length()).trim(); 
     return substring; 
    } 
} 

public static void main(String[] args) { 

    String fileContent = "23 + 4 + 13 = 40"; 

    PoorManTokenizer poorManTokenizer = new PoorManTokenizer(fileContent); 

    int firstNumber = poorManTokenizer.nextInt(); 
    char firstOperator = poorManTokenizer.nextChar(); 
    int secondNumber = poorManTokenizer.nextInt(); 
    char secondOperator = poorManTokenizer.nextChar(); 
    int thirdNumber = poorManTokenizer.nextInt(); 
    char thirdOperator = poorManTokenizer.nextChar(); 
    int lastNumber = poorManTokenizer.nextInt(); 

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