Подсчет появления символов в строке (частота) - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть этот графический интерфейс, который считает вхождения первой буквы в строке. Я хотел бы, чтобы он подсчитал все буквы в формате столбца, например:

enter image description here

Вот что у меня есть:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JPanel;  
import javax.swing.JTabbedPane;  
import javax.swing.JTextField;  
public class Index2 extends JFrame implements ActionListener  
{  
    private JTabbedPane jtabbedPane;  
    private JPanel characterFinder;  
    JTextField enterText, countText;  

    public Index2()  
    {  
        setSize(400, 250);  
        setVisible(true);  
        setSize(400, 250);  
        setVisible(true);  
        setTitle("Total Characters");  
        setSize(300, 200);  
        JPanel topPanel = new JPanel();  
        topPanel.setLayout(new BorderLayout());  
        getContentPane().add(topPanel);  
        createCharacterFinder();  
        jtabbedPane = new JTabbedPane();  
        jtabbedPane.addTab("Count Characters", characterFinder); 
        topPanel.add(jtabbedPane, BorderLayout.CENTER);  
    }
    public void createCharacterFinder()  
    {  
        characterFinder = new JPanel();  
        characterFinder.setLayout(null); 
        JLabel enterLabel = new JLabel(  
                "Enter Some Text");  
        enterLabel.setBounds(90, 5, 260, 20);  
        characterFinder.add(enterLabel); 
        enterText = new JTextField();  
        enterText.setBounds(10, 30, 270, 70);  
        characterFinder.add(enterText);  

        JButton search = new JButton("Count Occurences of Each Letter");  
        search.setBounds(15, 100, 260, 20);  
        search.addActionListener(this);  
        characterFinder.add(search);

        countText = new JTextField();  
        countText.setBounds(80, 130, 120, 500);  
        characterFinder.add(countText);
    }
        public void actionPerformed(ActionEvent e){
            String st=enterText.getText();
            char searchedChar=enterText.getText().charAt(0);
            count(searchedChar,st);
    }
    public int count(char c, String str) {
        if (str == null) return 0;
        int cnt = 0;
        for (int i = 0;; cnt++) {
        if ((i = str.indexOf(c,i)+1) == 0) break;
        }
        countText.setText("Character "+c+" occurs "+cnt+" times");
        return cnt;
        }

    public static void main(String[] args)  
    {  
        JFrame frame = new Index2();  
        frame.setSize(300, 700);  
        frame.setVisible(true);  
    }  
}

Ответы [ 5 ]

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

Хороший способ подсчета символов (при условии использования символов ASCII) состоит в том, чтобы воспользоваться преимуществом того факта, что 'a' может напрямую отображаться на число.

int[] charCounts(String s) {
  int[] counts = new int[256]; // maximum value of an ASCII character
  char[] c = s.toCharArray();
  for (int i=0;i<c.length;++i) {
      counts[c[i]]++;
  }
  return counts;
}

Теперь, чтобы найти количество любого конкретного элементаВы могли бы сделать counts['a'].

. Возможно, код станет более аккуратным, если просто выполнить подсчет с помощью метода, описанного выше, а затем просто отобразить счет с очень приблизительным значением:

int[] counts = charCounts("my string");
StringBuilder sb = new StringBuilder();
for (char a = 'a'; a <= 'z'; a++) {
    sb.append(a).append(" occurred ").append(counts[a]).append(" times\n");
}
2 голосов
/ 22 февраля 2013

Для подсчета вхождений символов в строке (частота использования символа), я предлагаю эту оптимизированную версию:

В большинстве случаев используйте int [] и SortedMap <> дляСимволы Юникода, избегайте скрытого создания целочисленных значений из-за автобокса:

import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.TreeMap;

public class CharCount {
   static class MutableInteger {
      int value;
      public MutableInteger( int v ) {
         value = v;
      }
      public void increment() {
         ++value;
      }
   }
   public static void main( String[] args ) {
      String string = "alabama&é€";
      int    len = string.length();
      int[]  freqArray = new int[255];
      SortedMap< Character, MutableInteger > freqMap = null;
      for( int i = 0; i < len; ++i )
      {
         char c = string.charAt( i );
         if( c < freqArray.length ) {
            ++freqArray[c];
         }
         else { // Unicode
            if( freqMap == null ) { // first use
               freqMap = new TreeMap<>();
            }
            MutableInteger f = freqMap.get( c );
            if( f == null ) {
               freqMap.put( c, new MutableInteger( 1 ));
            }
            else {
               f.increment();
            }
         }
      }
      for( int i = 0; i < freqArray.length; ++i ) {
         int v = freqArray[i];
         if( v > 0 ) {
            System.out.printf( "%c (%4d) : %d\n", (char)i, i, v );
         }
      }
      if( freqMap != null ) {
         for( Entry< Character, MutableInteger > entry : freqMap.entrySet()) {
            char c = entry.getKey().charValue();
            int v = entry.getValue().value;
            System.out.printf( "%c (%4d) : %d\n", c, (int)c, v );
         }
      }
   }
}

Выходы:

& (  38) : 1
a (  97) : 4
b (  98) : 1
l ( 108) : 1
m ( 109) : 1
é ( 233) : 1
€ (8364) : 1
2 голосов
/ 04 апреля 2011

Хм, ну, вы можете создать Hashmap

HashMap<Char, Integer> countedChars = new HashMap<Char, Integer>();

и проанализировать каждый символ строки следующим способом:

private void parseChar(String c) {
   if (!this.countedChars.containsKey(c)) {
       this.countedChars.put(c, 1);
   } else
       this.countedChars.put(c, this.countedChars.get(c)+1);
}
1 голос
/ 22 февраля 2013
import java.util.*;

public class CharsCounter {

    public Map<Character, Integer> count(String input) {
        char[] chars = (input + '\uFFFF').toCharArray();
        Arrays.sort(chars);

        Map<Character, Integer> charsCount = new LinkedHashMap<Character, Integer>();
        int first = 0;
        for (int i = 1; i < chars.length; i++) {
            if (chars[i] != chars[first]) {
                charsCount.put(chars[first], i - first);
                first = i;
            }
        }

        return charsCount;
    }

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

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

Здесь проходит первый символ

char searchedChar=enterText.getText().charAt(0);

если вам нужно рассмотреть каждый символ, то

char[] charsToSearch =enterText.getText().toCharArray();//and invoke method for each char
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...