2009-12-19 2 views
0

Я пишу метод Java, который принимает строку плюс и минус операций, напримерСпособ обработки строки плюс и минус операции

«+ 1 + 2 + 3-5», и я хочу его верните int ответа.

Я стараюсь сделать это максимально эффективно. Я пробовал метод String.split(), но он немного путается с плюсами и минусами.

Может ли кто-нибудь помочь? Нет, это не домашнее задание.

+0

Не уверен, что я понимаю ваш вопрос с точки зрения того, чего вы хотите. Не могли бы вы написать это с более явным запросом? –

+0

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

ответ

0

Вам понадобится разобрать символ строки по символу. Что-то вроде

int foo(String s){ 
    int total = 0; 
    String currentNum = "" 
    for(int i =0;i<s.length;i++){ 
     if(s[i] =="+"){ 
      total += Integer.parseInt(currentNum); 
      currentNum = "" 
     }else if(s[i] =="-"){ 
      total -= Integer.parseInt(currentNum); 
      currentNum = "" 
     }else{ 
      currentNum += s[i] 
     } 
    }  
    return total; 
} 
+0

Я думал о чем-то подобном. Я только понял, почему я просто не делал этого. Первоначально я собирался вернуть его в виде массива целых чисел и беспокоился о длине массива. Благодаря! – Philip

+1

@Philip: стоит пересмотреть свой первоначальный план, но вместо этого использовать 'ArrayList ' - таким образом вам не нужно беспокоиться о длине. Обратите внимание, что этот ответ фактически не компилируется по разным причинам, а также бесполезно неэффективен с точки зрения манипуляции с строкой. –

+2

(Он также игнорирует последнее число, кстати ... потому что он только разбирает что-либо, когда он пробегает + или - что не будет в конце.) –

3

Ну, несколько вещей, чтобы думать о ...

  • Вы могли бы потенциально использовать раскол, чтобы помочь с разбором, но вы будете нуждаться в сепараторах, а также номере
  • Вы можете просканировать строку, вспомнив, где находится начало текущего номера, и затем разбор его, когда вы нашли конец.
  • Какие структуры данных вы собираетесь использовать для хранения строки после ее анализа?
    • Вы можете считать, что вычитая 20, как добавление -20 ...
    • ... или вы можете думать о том, чередующихся между числом и оператором, начиная с неявным «+», если первым символ не является «-»
  • Вы должны решительно рассмотреть вопрос о разделении задачи на фазы «разбора» и «оценки». В частности, вы должны иметь возможность писать тесты для этапа оценки даже без написания кода разбора - и наоборот.
  • Вы говорите, что хотите сделать это максимально эффективно - почему? Эффективность часто (но, конечно, не всегда) врага ясности. Я бы по крайней мере попытался найти ясное решение сначала, а затем выяснить, насколько он эффективен. Часто четкое решение будет «достаточно эффективным».
2

shunting yard algorithm Это то, что вам нужно здесь, и это должно быть довольно легко реализовать на Java.

+0

Да ... но требования OP должны поддерживать «+» и «-»; нет приоритета оператора и нет скобок. Поэтому шунтирующий двор излишне усложнен. (Конечно, если он/она меняет требования ...) –

1

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

Pattern pattern = Pattern.compile("([+-]?)([\\d]+)"); 
String str = "+10-3+20-10-20"; 
Matcher m = pattern.matcher(str); 
while (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 

Этот фрагмент кода дает все признаки (group(1)) и все числа (group(2)) Теперь вы должны заполнить только While-цикл с пунктами, если это-собственно.

+0

Ницца, но я не буду использовать регулярное выражение, чтобы что-то разобрать. Используйте синтаксический анализатор для этого и используйте регулярное выражение для соответствия чему-либо. – BalusC

0

Я бы разделил сначала знаки плюса. В вашем примере вы получите «1», «2» и «3-5», затем обработайте каждый из них, разбив знак минуса.

0

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

public static int parser(char[] s){ 
    int total = 0; 
    String currentNum = ""; 
    String currentProc = "none"; 
    for(int i = 0; i < s.length; i++){ 
     if(s[i] =='+'){ 
      if(currentProc == "none"){ 
       total = Integer.parseInt(currentNum); 
       currentNum = ""; 
      } 
      else if(currentProc == "plus"){ 
       total += Integer.parseInt(currentNum); 
       currentNum = ""; 
      } 
      else{ 
       total -= Integer.parseInt(currentNum); 
       currentNum = ""; 
      } 
      currentProc = "plus"; 
     }else if(s[i] =='-'){ 
      if(currentProc == "none"){ 
       total = Integer.parseInt(currentNum); 
       currentNum = ""; 
      } 
      else if(currentProc == "plus"){ 
       total += Integer.parseInt(currentNum); 
       currentNum = ""; 
      } 
      else{ 
       total -= Integer.parseInt(currentNum); 
       currentNum = ""; 
      } 
      currentProc = "minus"; 
     }else{ 
      currentNum += s[i]; 
     } 
    } 
    if(currentProc == "plus"){ 
     total += Integer.parseInt(currentNum); 
    } 
    else{ 
     total -= Integer.parseInt(currentNum); 
    } 
    return total; 
} 
Смежные вопросы