java编程 字母数和单词数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编程 字母数和单词数问题相关的知识,希望对你有一定的参考价值。

写一个java程序模块。当通过键盘输入一串字符后,报告出每个字母出现过多少次,和有多少个非字母的字符。
要求代码写的要尽可能短,不能使用字符串一遍一遍重复的方法。

改编和扩展之前的模块代码。在数出每个字母的数目后,系统需提示用户输入一个单词。然后系统报告出这个单词曾经在之前那串字符中出现过多少次。*单词不是字符的一部分,而是独立的单词,就是一串字母前后都要有空格。
这是最后一道题,截止到明天下午,作业太多,我没有时间弄了,求您帮个忙。

//CountChar.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 = 0
with 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(),并在其中实现上述相关的功能。

参考技术A 翻转一个list,不能使用下面列出的Python库提供的方法,意思就是自己实现咯。调试中,稍后补充哈

以上是关于java编程 字母数和单词数问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言编程 输入一段英语文本 判断单词数 字符数和空格。求大神...

2.1.10 java编程规范

Java知识点整理——编程基础

Java_2.Java编程规范

Java 编程命名规范

用java编写随机生成一个6位的正整数,编程实现由这六位数字生成的最大数和最小数