java编程 字母数和单词数问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编程 字母数和单词数问题相关的知识,希望对你有一定的参考价值。
写一个java程序模块。当通过键盘输入一串字符后,报告出每个字母出现过多少次,和有多少个非字母的字符。
要求代码写的要尽可能短,不能使用字符串一遍一遍重复的方法。
改编和扩展之前的模块代码。在数出每个字母的数目后,系统需提示用户输入一个单词。然后系统报告出这个单词曾经在之前那串字符中出现过多少次。*单词不是字符的一部分,而是独立的单词,就是一串字母前后都要有空格。
这是最后一道题,截止到明天下午,作业太多,我没有时间弄了,求您帮个忙。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Hashtable;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
public class CountChar extends javax.swing.JPanel implements ActionListener
private JTextArea input;
private JLabel result;
private JButton ok;
private JTextField findresult;
private JLabel find;
private JTextArea output;
private JScrollPane jScrollPane1;
private JDialog jDialog1;
private JLabel welcome;
private JButton tongji;
private String str;
/**
* Auto-generated main method to display this JPanel inside a new JFrame.
*/
public static void main(String[] args)
JFrame frame = new JFrame();
frame.getContentPane().add(new CountChar());
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
public CountChar()
super();
initGUI();
private void initGUI()
try
this.setPreferredSize(new java.awt.Dimension(400, 226));
this.setLayout(null);
input = new JTextArea();
this.add(input);
input.setBounds(12, 37, 376, 149);
input.setBorder(new LineBorder(new java.awt.Color(0, 0, 0), 1,
false));
tongji = new JButton();
this.add(tongji);
tongji.setText("统 计");
tongji.setBounds(140, 192, 108, 22);
tongji.addActionListener(this);
welcome = new JLabel();
this.add(welcome);
welcome.setText("请输入文字:");
welcome.setBounds(12, 12, 121, 14);
jDialog1 = new JDialog();
// this.add(jDialog1);
jDialog1.setModal(true);
jDialog1.setTitle("结 果:");
jDialog1.setLayout(null);
jDialog1.setBounds(0, 0, 404, 251);
jScrollPane1 = new JScrollPane();
jDialog1.getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(30, 12, 338, 120);
output = new JTextArea();
jScrollPane1.setViewportView(output);
find = new JLabel();
jDialog1.getContentPane().add(find);
find.setText("请输入你要查的单词:");
find.setBounds(30, 144, 148, 15);
findresult = new JTextField();
jDialog1.getContentPane().add(findresult);
findresult.setBounds(178, 140, 118, 22);
ok = new JButton();
jDialog1.getContentPane().add(ok);
ok.setText("\u786e\u5b9a");
ok.setBounds(302, 140, 66, 20);
ok.addActionListener(this);
result = new JLabel();
jDialog1.getContentPane().add(result);
result.setText("该单词出现");
result.setBounds(30, 184, 136, 15);
catch (Exception e)
e.printStackTrace();
public void actionPerformed(ActionEvent e)
if (e.getSource() == tongji)
str=input.getText();
if(str.equals(""))
JOptionPane.showMessageDialog(null,"对不起,你没有输入任何文字。");
return;
Hashtable charTJ=new Hashtable();
String info="你输入的文字是:\n"+str;
info+="\n字母统计结果:\n";
char[] c=str.toCharArray();
for(int s=0;s<c.length;s++)
if((c[s]>='a'&&c[s]<='z')|(c[s]>='A'&&c[s]<='Z'))
if(charTJ.get(c[s])!=null)
charTJ.put(c[s],((Integer)charTJ.get(c[s])).intValue()+1);
else
charTJ.put(c[s],1);
for(char a='A';a<='Z';a++)
info+=a;
info+="\t";
info+=charTJ.get(a)==null?0:charTJ.get(a);
info+="\n";
for(char a='a';a<='z';a++)
info+=a;
info+="\t";
info+=charTJ.get(a)==null?0:charTJ.get(a);
info+="\n";
output.setText(info);
jDialog1.setVisible(true);
else if (e.getSource() == ok)
String[] strs=str.split(" ");
String findstr=findresult.getText().trim();
if(findstr.equals(""))
JOptionPane.showMessageDialog(null,"对不起,你没有输入任何单词。");
return;
int count =0;
for(int i=0;i<strs.length;i++)
if(strs[i].equals(findstr))
count++;
result.setText("该单词出现"+count+"次");
参考技术A 方法可能有点笨,不过效果实现了,希望对你有帮助
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test
public static void main(String[] args)
/**
* 第一个问题
* 通过键盘输入一串字符后,报告出每个字母出现过多少次,和有多少个非字母的字符
*/
Pattern p = Pattern.compile("[a-zA-Z]"); //设定正则表达式条件,只有符合字母
Matcher m = null;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("请输入一个字符串:");
String str = null;
int count =0; //非字母出现次数
HashMap map= new HashMap(); //实例化map
try
str = br.readLine(); //得到键盘输入信息
System.out.println("您输入的字符串是:" + str);
for (int i = 0; i < str.length(); i++) //循环这个字符串
String key=null;
if(i==(str.length()-1)) //得到最后一个字符
m = p.matcher(str.substring(i)); //用正则验证字符串
if(m.find()) //匹配的
key = str.substring(i); //将字母赋值给key以便最后在map中查找相应的出现次数
map.put(str.substring(i),str.split(str.substring(i)).length); //将字母于出现次数存入map
else //不匹配的
count++; //非字母出现次数+1
else //得到第一个字符到倒数第二个字符
if(!str.substring(i,i+1).equals(str.substring(str.length()-1))) //判断是否不等于最后一个字符
m = p.matcher(str.substring(i,i+1)); //用正则验证字符串
if(m.find())//匹配的
if(map.containsKey(str.substring(i,i+1))) //如果map中已经存在这个字母不做任何操作
else
key = str.substring(i,i+1); //将字母赋值给key以便最后在map中查找相应的出现次数
map.put(str.substring(i,i+1),str.split(str.substring(i,i+1)).length-1); //将字母于出现次数存入map
else //不匹配的
count++; //非字母出现次数+1
if(map.containsKey(key)) //根据key查找map中相应的值
System.out.println("字母"+key+"出现的次数是:"+map.get(key));
System.out.println("非字母包括空格出现的次数是:"+count);
catch (IOException e)
// TODO 自动生成 catch 块
e.printStackTrace();
/**
* 第二个问题
* 在数出每个字母的数目后,系统需提示用户输入一个单词。
* 然后系统报告出这个单词曾经在之前那串字符中出现过多少次。
*/
System.out.println("");
System.out.println("**********************************");
System.out.println("");
System.out.print("请输入一个单词:");
String str2=null;
try
str2 = br.readLine().trim();
System.out.println("您输入的单词是:" + str2);
if(str.substring(str.length()-4).equals(str2))
System.out.println( str2+" 在 "+str+"中出现的次数是:"+(str.split(str2).length));
else
System.out.println( str2+" 在 "+str+"中出现的次数是:"+(str.split(str2).length-1));
catch (IOException e)
// TODO 自动生成 catch 块
e.printStackTrace();
参考技术B 这分我要了,还是我写的最好
package my.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CountTest
public static void main(String []args)
//测试,不和你折腾了,老板看到会骂的,有空可以学学正则表达式,记得给分啊,到目前为止好像没人比我写的好了
String test=" zhe shi yi ge ci shi yong de zi fu chuan,kan kan jie guo. shi";
System.out.println(countWord(test));
System.out.println(countLetter(test));
System.out.println(findWord(test,"shi"));
/**
* 检索单词数,所有前后有空格的认定为一个单词
* @param input
* @return
*/
public static int countWord(String input)
String regExp="\\s*[,.。]+\\s*|\\s+";
return input.trim().split(regExp).length;
public static int countLetter(String input)
String regExp="[^a-zA-Z]+";
StringBuffer buffer=new StringBuffer();
for(String temp:input.split(regExp))
buffer.append(temp);
return buffer.length();
/**
* 用于检索word指定的单词在input这个输入串里边的出现次数
* @param input
* @param word
* @return 返回实际出现的次数
*/
public static int findWord(String input,String word)
int count=0;
String regExp="\\s*\\b("+word+")\\b";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(input);
while(matcher.find())
for(int i=1;i<=matcher.groupCount();i++)
System.out.println("出现位置:"+matcher.start(i)+" "+matcher.end(i)+" 实际的单词:"+matcher.group(i));
count++;
System.out.println("总共出现:"+count+"次"+word);
return count;
楼上的话可以乱说,X不要乱放,你不是对我给的这个测试字符串说的吧,如果是你请看清楚,为了测试特殊情况,我在开头加了一个空格(我是计算空格在内的,如果你不打算把开头的空格计算在内的话,自己调用trim)。要是有bug你就指出来你的输入串,结果是什么,什么地方不对,如果只是乱放XX的话滚远点,没事的时候把我的代码和你的代码好好比比看看谁的简单谁的合理 参考技术C String s = "从键盘输入的字符串";
// s = s.toLowerCase(); // 如果不区分字母大小写。
Map map = new HashMap();
for(int i=0; i<s.length(); i++)
char c = s.charAt(i);
String key = "非字母";
if((c>=65 && c <= 90) || (c>=97 && c<=122))
key = String.valueOf(c);
Integer num = (Integer)map.get(key);
if(num == null)
num = new Integer(1);
else
num = new Integer(num.intValue() + 1);
map.put(key, num);
// 打印结果出来。
Iterator iter = map.keySet().iterator();
while(iter.hasNext())
String key = (String)iter.next();
Integer num = (Integer)map.get(key);
System.out.println(key + " 出现次数:" + num);
不是很明白你第二个问题的。
但可以用String.index(startIndex, subStr)方法来处理。
参考:http://zhidao.baidu.com/question/52475004.html 参考技术D import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test
public static void main(String[] args) throws IOException
int zimu = 0;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("输入字符串:");
String s = " "+in.readLine()+" "+" ";
for(int i=65;i<=122;i++)
if(i>90 && i<97)continue;
int len=s.split(((char)i)+"").length-1;
System.out.println("字母"+(char)i+"的数量是:"+len);
zimu+=len;
System.out.println("字母数:" + zimu);
System.out.println("非字母数:" + (s.trim().length()-zimu));
System.out.print("输入单词:");
String t = " "+(in.readLine().trim())+" ";
System.out.println("单词"+t+"的数量是:"+(s.split(t).length-1));
Python题目
14. 单词计数。 UNIX/Linux 系统上有一个通用实用程序,名为“we”。该程序分析一个文件以确定其中包含的行数、单词数和字符数。编写你自己的wc版本。程序应接受文件名作为输入,然后打印三个数字,显示文件的行数、单词数和字符数。
这并不是什么困难的题目吧?属于很基础的内容了。
不考虑性能与功能健壮的情况下,伪代码如下:
以r模式打开文件:逐行读出:
行计数加1
以空格拆分行为一个列表,
词计数增加列表长度
字符数增加列表所有元素的长度之和
输出结果
在python的安装目录下有文件LICENSE.txt,以它为例:
linecount = wordcount = charcount = 0with open('LICENSE.txt', 'r') as f:
for line in f:
linecount += 1
words = line.split(' ')
wordcount += len(words)
charcount += sum(len(_) for _ in words)
print(linecount, wordcount, charcount)
运行输出结果:
605 5258 25385
至于更进一步,就需要考虑一些意外的情况了:
是否有chr(9)替代了某些空格?它会影响对line的拆分,进而影响单词数与字符数的统计;
是否有连续的空格,它的影响同上;
除空格外,是否还有不计入字符数据的字符(比如标点符号之类的)?
要处理这些问题,一般都需要在将一行拆分为words的过程中或紧随其后去处理。如有必要,“line.split(' ')”可以替换为一个自行编写的函数如splitbyword(),并在其中实现上述相关的功能。
以上是关于java编程 字母数和单词数问题的主要内容,如果未能解决你的问题,请参考以下文章