Подсчет символов в строковой Java - PullRequest
1 голос
/ 13 февраля 2012

Привет, у меня есть проблема в моем коде, я должен подсчитать переменные, используемые в выражении, и когда две или более переменных одинаковы, он должен быть посчитан как 1. Например, a + ab = общее количество используемых переменных: 2. Проблема в том, что я ввел a + a = общее количество используемых переменных: 2. Вот мой код:

public void simplify(String strexp){
    int ex =strexp.length();

    for (int a=0;a<=ex-1;a++){
        if(a==0)
        {
        if (Character.isLetter(strexp.charAt(a)))
        {
        b++;
       }


        }
        else{
        for(int c=0;c<=a-1;c++){
              if (Character.isLetter(strexp.charAt(c))==Character.isLetter(strexp.charAt(a)))
              {

                System.out.println("equal");
                break;
              }
              else if (Character.isLetter(strexp.charAt(c))!=Character.isLetter(strexp.charAt(a)))
              {
             //if(c==a-1)
              //{
               b++;
               System.out.println("nomatch");
           //  }
               }
        }
        }
        }
   JOptionPane.showMessageDialog(null, b);
    }

Ответы [ 6 ]

0 голосов
/ 13 февраля 2012

Вот что-то:

public class DistinctCharCount {
    public static void main(String[] args) {
        String s = "a+ab+abc+abcd";

        HashSet<Character> charSet = new HashSet<Character>();        
        for(int i=0;i<s.length();i++) {
            charSet.add(s.charAt(i));
        }

        System.out.println("Distinct Char Count : " + charSet.size());
    }
}
0 голосов
/ 13 февраля 2012

Как насчет однострочника ?

String complexExpression = "a + a*2 (2*a + b - 34)/2 + 3*c";

System.out.println(Arrays.toString(complexExpression.split("[+*()-/\\d\\s&&[^a-z]]+")));

System.out.println(new HashSet<String>(Arrays.asList(complexExpression.split("[+*()-/\\d\\s&&[^a-z]]+"))).size());

Приведенный выше код выводит для меня следующее:

[a, a, a, b, c]
3

Конечно, я нерекомендуем выполнять операцию split несколько раз с одним и тем же шаблоном.

0 голосов
/ 13 февраля 2012

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

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

0 голосов
/ 13 февраля 2012

Используйте список для подсчета общего количества переменных

public static int simplify(String strexp) {
    int length = strexp.length();

    List<Character> usedVariables = new ArrayList<Character>();
    for (int i = 0; i < length; i++) {
        char c = strexp.charAt(i);
        if (Character.isLetter(c) && !usedVariables.contains(c)) {
            usedVariables.add(c);
        }
    }

    return usedVariables.size();
}

public static void main(String[] args) {
    System.out.println(simplify("x + b = d"));
    System.out.println(simplify("x + x = a"));
    System.out.println(simplify("x + x = x / 2"));
}

Это распечатывает

3
2
1
0 голосов
/ 13 февраля 2012

Вы должны отслеживать, какие переменные вы видели. Для этого можно использовать Set<char>. Всякий раз, когда вы видите персонажа, добавьте его в набор. Количество уникальных операторов будет количеством символов в наборе.

0 голосов
/ 13 февраля 2012

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

import java.util.*;

    class Main

{
    public static void main (String[] args) 
    {
        String yourString = "UNDERSTAND";

        Map<Character, Integer> count = new TreeMap<Character, Integer>();
        for (char c : yourString.toCharArray()) {
            if (count.containsKey(c)) {
                count.put(c, (int) count.get(c) + 1);
            } else {
                count.put(c, 1);
            }
        }

        System.out.println(count);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...