цикл (помните, где в последний раз искать) & Character.isDigit () - PullRequest
0 голосов
/ 18 апреля 2011

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

У меня также есть массив объектов.Каждый объект представляет элемент в периодической таблице.Теперь мне нужно разбить эту строку, которую пользователь отправляет мне на более мелкие части - на части, которые распознаются массивом объектов.Я также должен умножить ответ либо на один, либо на число рядом с последней буквой элемента.

Я уже попробовал следующее.Сделайте строку массивом символов.Пробежаться по массиву задом наперед - проверить число (Character.isDigit(a[i]);), проверить прописные и строчные буквы ... Я всегда сталкиваюсь с одной и той же проблемой.Я понятия не имею, как долго будет длиться строка.Допустим, я нахожу номер.Затем, если предыдущий символ представляет собой строчную букву, мне нужно сделать еще одну проверку в обратном направлении для заглавной буквы.Тогда, скажем, у меня есть молекулярное уравнение и сумма, на которую нужно умножить его - как я могу сообщить компьютеру, чтобы он начал смотреть с последней заглавной буквы.

Надеюсь, кто-то это понимает!

Действительно нуждается в некоторой помощи.

Еще один вопрос: почему этот код не работает:

String moleq = "HeKiLH2B6";

char[] a = moleq.toCharArray();
int g = moleq.length()-1;
int x = 1; //if not more than one of element - multiply getWeight by 1

int[][] indexofdigit = new int[moleq.length()][2];
int[] indexoflower = new int[moleq.length()];

for (int i = g; i <= 0; i--){

    if (Character.isDigit(a[i])) {
    String z = Character.toString(a[i]);
    x = Integer.parseInt(z);
    System.out.println("YES");

    }
}

Этот код никогда не печатает мне Да?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2011

Ваш цикл никогда не выполняется, так как вы ищете условие i <= 0. И вначале это неверно, так как g> 0, если вы измените i> = 0, это будет работать

3 голосов
/ 18 апреля 2011

Для химических формул, возможно, было бы интересно регулярное выражение (регулярное выражение).Что-то вроде ([AZ] [az]? [0-9] ) +.Если я не ошибаюсь (), это изолирует элемент и его мощность (например, Fe2O3 -> группа 1 (Fe2) + группа 2 (O3)).Посмотрите на Pattern и Matcher для этого.

  • Если я ошибаюсь, я уверен, что где-то в Google есть регулярное выражение для формул.Обычно он не зависит от языка (если он работает на Perl, то работает на Java).
2 голосов
/ 18 апреля 2011

Обратите внимание, что с Java 5+ вы можете упростить этот цикл, используя для каждого цикла:

for (char c : a){
  if (Character.isDigit(c)) {
    String z = Character.toString(c);
    x = Integer.parseInt(z);
    System.out.println("YES");
  }
}

Чтобы расширить предложение SJuan:

String input = "HeKiLH2B6";
Pattern p = Pattern.compile("([A-Z][a-z]*)(\\d*)");    
Matcher m = p.matcher( input );

while(m.find()){
  String element = m.group( 1 );
  String cardinalityStr = m.group( 2 );
  int cardinality= 1;
  if( cardinalityStr != null && cardinalityStr .length() > 0)
  {
    cardinality= Integer.parseInt( cardinalityStr );
  }

  System.out.println( element + cardinality);
}

Выход:

He1
Ki1
L1
H2
B6

Редактировать: это также будет работать, если пользователь введет что-то вроде He-Ki-L-H2-B6 или He Ki L H2 B6.

1 голос
/ 18 апреля 2011

Ответ SJuan76 в коде (с добавленным классификатором неохотной группы):

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {
        // the compiled pattern can be re-used, are thread-safe 
        // and thus can be static final
        Pattern p = Pattern.compile("([A-Z][a-z]?[0-9]*)+?");

        // Per molecule (well, string) a matcher must be obtained.
        Matcher m = p.matcher("HeKiLH2B6");
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

Это печатает:

He
Ki
L
H2
B6
...