Java笔试题共23题(附答案)

更新时间:2024-06-29 23:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

\★里面有解题思路一样的没有全部解答,仅仅将题目列出,稍微改变即可得出结果★ \笔试题重点, \1、复制文件 \2、多线程 \3、集合 \4、反射

///////////////////////////////////////////////////////////////////// \/*

Collection集合体系图 Collection |----List 元素有序,可重复 |----ArrayList 底层数据结构是数组,查询快,增删慢,线程不安全,效率高 |----Vector 底层数据结构是数组,查询快,增删慢,线程★安全★,效率低 |----LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高 |----Set 元素无序,唯一。 |----HashSet |----TreeSet

遍历集合的两种方式: 1、通过获取键的集合,遍历键的集合,通过键获取值 2、通过键值对集合,遍历键值对对象,分别取得键值 */

import java.util.HashMap; import java.util.Set;

import java.util.Map.Entry; import java.util.Map; class ForMap { public static void main(String[] args) { //创建一个map对象 HashMap map = new HashMap();

//向map中添加元素 map.put(\map.put(\map.put(\map.put(\//获取键的集合

Set set = map.keySet(); //循环遍历键集合 for (String str : set) {

//通过键获取值 System.out.println(str+\}

System.out.println(\

//获取map的键值对集合

Set> mset = map.entrySet(); //循环遍历键值对集合

for(Entry me : mset) {

//用键值对对象分别获取键和值 System.out.println(me.getKey()+\ } System.out.println(\ } }

//////////////////////////////////////////////////////////////////// \/*

题目1: 创建ArrayList对象,添加5个元素,使用Iterator遍历输出。*/

\/*题目2: 两个集合{“a”,“b”,“c”,“d”,“e”}和{“d”,“e”,“f”,“g”,“h”}, 把这两个集合去除重复项合并成一个 思路: 这道题主要是考察集合的知识的,可以用ArrayList解决问题 1、先创建这两个集合 2、向这两个集合分别添加元素 3、用第二个集合的调用iterator()方法获取Iterator对象 4、遍历第二个集合,并用第一个集合判断是否包含第一个 集合的元素,如果不包含就向集合一添加元素 5、打印集合1,就是想要的结果 */ //导包

import java.util.List;

import java.util.ArrayList; import java.util.Iterator;

class Test { public static void main(String args[]) { //创建集合1 List list1 = new ArrayList(); //向集合1添加元素

list1.add(\list1.add(\list1.add(\list1.add(\list1.add(\

//创建集合2

List list2 = new ArrayList(); //向集合2添加元素 list2.add(\list2.add(\list2.add(\list2.add(\list2.add(\

//获取集合2的迭代器 Iterator it = list2.iterator(); //遍历集合2 while(it.hasNext()) { String str = (String) it.next(); //如果不包含就向集合1添加此元素 if(!list1.contains(str)) { list1.add(str); } } System.out.println(list1); } }

///////////////////////////////////////////////////////////////////// \/*

题目: 已知文件a.txt文件中的内容为“bcdeadferwplkou”,请编写程序读取该文件内容, 并按照自然排序顺序后输出到b.txt文件中。即b.txt文件内容应为\这样的顺序 思路: 1、先将a.txt文件内容读取出来并存到字符数组中 2、用Arrays.sort(字符数组) 将这个字符数组排序 3、将字符数组输出到b.txt文件中 */

import java.io.IOException; import java.io.File;

import java.io.BufferedReader; import java.io.BufferedWriter;

import java.io.FileReader; import java.io.FileWriter; import java.util.Arrays;

class ReadFileAndSortString { public static void main(String args[]) throws IOException { //封装数据源及目的地File File a = new File(\ File b = new File(\

//高效字符输入流得到数据源

BufferedReader br = new BufferedReader(new FileReader(a)); //高效字符输出流得到目的地

BufferedWriter bw = new BufferedWriter(new FileWriter(b)); String line =null; //循环读取文件

while((line = br.readLine())!=null) { //得到读取一行字符串的长度 int len = line.length(); char[] chrs = new char[len]; //转换成字符数组 chrs = line.toCharArray(); //通过Arrays的sort方法排序 Arrays.sort(chrs); }

System.out.println(\字符串:\//写到文件中 bw.write(chrs); bw.newLine(); //刷新缓冲区 bw.flush();

//关闭资源 br.close(); bw.close();

System.out.println(\复制成功\ } }

///////////////////////////////////////////////////////////////////// \/*

题目: 编写一个程序, 将指定目录下所有.java文件拷贝到另一个目录中, 并将扩展名改为.txt

思路: 1、用File对象封装目录 2、通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组 3、遍历这个File数组,得到每一个File对象 4、判断该File对象是否是文件 a、如果是文件 b、继续判断是否以.java结尾 是:先改名后复制文件 否:不复制 */

//导包

import java.io.IOException; import java.io.File;

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; class Test { public static void main(String[] args) throws IOException { //用File对象封装目录 File srcfile = new File(\ //用File对象封装目录 File destFile = new File(\

//调用复制的方法 copyFile(srcfile,destFile); }

//复制方法

public static void copyFile(File srcFile, File destFile) throws IOException { //通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组 File[] fileArray = srcFile.listFiles(); //遍历这个File数组,得到每一个File对象 for(File file : fileArray) { //判断该File对象是否是文件 if(file.isFile()) { //如果不是以java为后缀的不复制,执行下次循环 if(!file.getName().endsWith(\ { continue; }

//新文件File对象//复制前改名 File newFile = new File(destFile,file.getName().replace(\ //用高效的字节输入流封装数据源 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

//用高效的字节输出流封装目的地 BufferedOutputStream bos = FileOutputStream(newFile)); byte[] bys= new byte[1024]; int len = 0;

//判断是否读到文件结尾

while( (len = bis.read(bys)) != -1 ) {

new

BufferedOutputStream(new

//将数据写到文件中 bos.write(bys,0,len); //刷新缓存流 bos.flush(); } //关闭流对象 bis.close(); bos.close(); } } } }

/////////////////////////////////////////////////////////// \/*

题目1: 将项目路径下java_all目录下所有的.java文件复制到项目路径下Java_jad 文件夹下,并将文件名从原来的.java修改成.jad*/

\/*题目2: 编写一个程序,把一个目录里边的所有带.java文件拷贝到另一个目录中, 拷贝成功后,把后缀名是.java的文件改为.txt文件。(注意事项:是先拷贝, 拷贝成功后才可以改后缀名的)*/ \★将以下代码改改路径和扩展名即可★) /* 思路: 1、用File对象封装目录 2、通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组 3、遍历这个File数组,得到每一个File对象 4、判断该File对象是否是文件 a、如果是文件

*/

b、继续判断是否以.java结尾 是:复制文件 在复制完成后改名 否:不复制

//导包

import java.io.IOException; import java.io.File;

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; class FileCopySingleFolderByByte { public static void main(String[] args) throws IOException {

//用File对象封装目录

File srcfile = new File(\//用File对象封装目录

File destFile = new File(\

//调用复制的方法 copyFile(srcfile,destFile); } //复制方法 public static void copyFile(File srcFile, File destFile) throws IOException { //通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组 File[] fileArray = srcFile.listFiles(); //遍历这个File数组,得到每一个File对象 for(File file : fileArray) { //判断该File对象是否是文件 if(file.isFile()) { //如果不是以java为后缀的不复制,执行下次循环 if(!file.getName().endsWith(\ { continue; } //新文件 File newFile = new File(destFile, file.getName()); //用高效的字节输入流封装数据源 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

//用高效的字节输出流封装目的地 BufferedOutputStream bos = FileOutputStream(newFile)); byte[] bys= new byte[1024]; int len = 0;

//判断是否读到文件结尾

while( (len = bis.read(bys)) != -1 ) { }

//将数据写到文件中 bos.write(bys,0,len); //刷新缓存流 bos.flush();

new BufferedOutputStream(new

//关闭流对象 bis.close(); bos.close();

//得到新文件名

String newName = newFile.getName().replace(\//根据新文件名创建新文件对象

File tempFile = new File(destFile,newName);

//改名 newFile.renameTo(tempFile); } } } }

///////////////////////////////////////////////////////////////////// \/*

题目: 统计一个文件夹下的txt文件个数,包括所有子文件夹内, 并将它们全部复制到D盘任意目录下 思路: (★提示★)用高效字节流可以用来复制任意类型文件 1、定义一个统计变量 2、用File对象封装目录 3、通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组 4、遍历这个File数组,得到每一个File对象 5、判断该File对象是否是文件夹 a、如果是文件夹回到第3步 b、继续判断是否以.txt结尾 是:复制文件并将统计文件变量加1 否:不复制 */

//导包

import java.io.IOException; import java.io.File;

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; class FileCopyMultiFolderByByte {

//用来统计复制文件的总个数 public static int count =0;

public static void main(String[] args) throws IOException {

//用File对象封装目录

File srcfile = new File(\//用File对象封装目录

File destFile = new File(\

//调用复制的方法 copyFolder(srcfile,destFile); System.out.println(\文件复制完毕,共复制文件 \个\}

//复制方法

public static void copyFolder(File srcFile, File destFile) throws IOException {

//通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组 File[] fileArray = srcFile.listFiles();

//遍历这个File数组,得到每一个File对象 for(File file : fileArray) { //判断该File对象是否是文件夹 if(file.isDirectory()) {

//多级目录递归 copyFolder(file,destFile); } else { //文件 File newFile = new File(destFile, file.getName()); copyFile(file , newFile); } } }

//复制文件并计数的方法

public static void copyFile(File srcFile, File newFile) throws IOException { //如果不是以txt为后缀的不复制,跳出循环 if(!srcFile.getName().endsWith(\ {

continue; }

//统计文件个数的变量加1 count++;

//用高效的字节输入流封装数据源 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)); //用高效的字节输出流封装目的地 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile)); byte[] bys= new byte[1024]; int len = 0;

//判断是否读到文件结尾

while( (len = bis.read(bys)) != -1 ) { //将数据写到文件中 bos.write(bys,0,len); //刷新缓存流 bos.flush(); }

//关闭流对象 bis.close(); bos.close(); } }

///////////////////////////////////////////////////////////////////// \/*

题目: 创建多线程的方式有几种?请代码实现 解答: 一共两种。 1、通过实现Runnable接口,重写run()方法 2、通过继承THread类,重写run()方法。 */ //

class ThreadTest { public static void main(String [] args)

}

{ }

//创建RunnableImpl类对象

RunnableImpl ri = new RunnableImpl();

//创建Thread类的对象,并把ri作为参数传递 Thread t1 = new Thread(ri); //给线程设置名字

t1.setName(\线程\//启动线程 t1.start();

//创建ThreadImpl类对象

ThreadImpl ti = new ThreadImpl(); ti.setName(\线程\//启动线程 ti.start();

//1、通过实现Runnable接口,重写run()方法 class RunnableImpl implements Runnable { @Override public void run() { }

}

System.out.println(Thread.currentThread() .getName()+\正在执行任务\

//2、通过继承THread类,重写run()方法。 class ThreadImpl extends Thread { @Override public void run() { System.out.println(getName()+\正在执行任务\ } }

///////////////////////////////////////////// \/*

题目: 定义一个类实现Runnable接口,卖票100张,四个线程,输出格式为“窗口1,还剩10张票” ,指定窗口3卖第10张票。 思路: 1、定义一个资源类实现Runnable接口 2、资源类重写run()方法,并加锁卖票

3、在测试类中创建线程并启动 */

class SellTicket { public static void main(String[] args) { //创建一个资源对象 Tickets ticket = new Tickets();

//创建线程对象并传入资源对象 Thread t1 = new Thread(ticket); Thread t2 = new Thread(ticket); Thread t3 = new Thread(ticket); Thread t4 = new Thread(ticket);

//设置线程名称 t1.setName(\窗口1\ t2.setName(\窗口2\ t3.setName(\窗口3\ t4.setName(\窗口4\ //启动线程 t1.start(); t2.start(); t3.start(); t4.start(); } }

class Tickets implements Runnable { private int ticket = 100; @Override public void run() { while(true) { //加锁 synchronized(this) { //剩余票数不大于0就退出循环 if(ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e)

{ e.printStackTrace(); } //让窗口3卖第十张票 if(ticket == 10) { if(!Thread.currentThread().getName().equals(\窗口3\ { continue; } } System.out.println(Thread.currentThread().getName()+\还( --ticket )+\张票\ } else { break; } } } } }

//////////////////////////////////////////////////////// \/*

剩\

写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法, 用for循环创建5个线程对象。需求如下:

① 利用线程类的构造函数输出:\创建线程4\。

(备注:当创建一个线程的时候,标记为1,再次创建一个线程的时候,标记为2, 所以输出的\创建线程4\就是创建的第四个线程) ② 在run方法中输出:“线程X :计数Y”,当执行次数达到6次的时候,退出。 (备注:其中“线程X”为第X个线程,“计数Y”为该线程的run方法执行了多少次) */

class SellTicket { public static void main(String[] args) { //用for循环创建5个线程对象 for(int i = 1; i <= 5 ;i ++) { new Thread(new MyThread (i) ).start(); } } }

class MyThread implements Runnable { private int count; public MyThread(){} public MyThread(int count) { this.count = count;

System.out.println(\创建线程\ } @Override public void run() { for(int i = 1 ; i <=6; i++) { System.out.println(\线程\计数\ } } }

/////////////////////////////////////////////////////////// \/*

题目: 编写一个Java程序实现多线程,在线程中输出多线程名字,隔300毫秒输出一次, 共输出20次。 思路: 1、用实现Runnable接口并重写run方法 2、创建线程 */

class Test { public static void main(String[] args) { //创建线程对象 Thread t1 = new Thread(new MyThread () ); Thread t2 = new Thread(new MyThread () ); //设置线程名称 t1.setName(\我是线程1\ t2.setName(\我是线程2\ //启动线程 t1.start(); t2.start(); } }

//实现Runnable接口

class MyThread implements Runnable { @Override public void run() { //循环20次 for(int i = 1 ; i <=20; i++) { try { //休眠300毫秒 Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); }

//打印线程名称 System.out.println(\线程名称:\ } } }

///////////////////////////////////////////////////////////////////// \/*

题目: 输出一个字符串,怎样判断是否是aba,abcba,abffba,的字符串 思路: 1、首先判断是奇数个还是偶数个(字符串的长度%2,1为基数,0为偶数) 2、是0就是偶数个 //得到前半部分子字符串 字符串.substring(0,字符串的长度/2 ) //得到前后半部分子字符串 字符串.substring(字符串的长度/2 ,字符串的长度 ) 字符串.toCharArray()分别得到两个字符数组 在循环字符数组 一个正序一个倒序的 用对比字符是否equals 3、是1就是奇数个 //得到前半部分子字符串 字符串.substring(0,字符串的长度/2 ) //得到前后半部分子字符串 字符串.substring(字符串的长度/2+1 ,字符串的长度 ) 字符串.toCharArray()分别得到两个字符数组

*/

import java.util.Scanner;

class StringDemo { public static void main(String[] args) { while(true) { show(); } } public static void show() {

System.out.print(\请输入要判断的字符串:\Scanner sc = new Scanner(System.in); String line = sc.nextLine();

System.out.println(\你输入的是:\int length = line.length();

//先判断字符串的字符个数是奇数还是偶数 //偶数时

if(length%2==0) { //截取成前后两个子字符串 String s1 = line.substring(0,length/2);

String s2 = line.substring( length/2 , length); //注意偶数个和奇数个的不同在此://将两个字符串转换成字符数组

char[] chs1 = s1.toCharArray(); char[] chs2 = s2.toCharArray(); int chsLength = chs1.length;

//统计对比次数和数组长度一致就是符合,否则不符合 int count = 0; //遍历数组

for(int i = 0 ; i < chsLength; i++) { //对比字符是否相同 if(chs1[ i ] !=chs2[ chsLength - i - 1 ]) { System.out.println(\这个字符串不符合aba\ break; } //统计对比次数 count ++;

偶数不加1

} } else {

if(count == chsLength ) { System.out.println(\符合aba\}

//截取成前后两个子字符串

String s1 = line.substring(0,length/2);

String s2 = line.substring( length/2 + 1, length); //注意偶数个和奇数个的不同在此:奇数加1 //将两个字符串转换成字符数组 char[] chs1 = s1.toCharArray(); char[] chs2 = s2.toCharArray(); int chsLength = chs1.length;

//统计对比次数和数组长度一致就是符合,否则不符合 int count = 0; //遍历数组

for(int i = 0 ; i < chsLength; i++) { //对比字符是否相同 if(chs1[i] !=chs2[chsLength-i-1]) {

}

System.out.println(\这个字符串不符合aba\break;

//统计对比次数 count ++; if(count == chsLength ) { System.out.println(\符合aba\ } } } } }

//////////////////////////////////////////////////// \/*

题目: 如何用反射创建一个对象。用两种方式,要求写代码 思路:

一共有三种方式 1、调用Object类的getClass()方法 2、数据类型的静态的class属性 3、通过Class类的静态方法forName(String className) (注意:使用这种方式的时候要用全路径名) */

import java.lang.reflect.Constructor; class Test { public static void main(String[] args) throws Exception {

//第一种:获取字节码文件对象

Class c1 = Class.forName(\

//获取构造器对象

Constructor con1 = c1.getConstructor(String.class,int.class); //创建对象

con1.newInstance(\张三\//第二种:获取字节码文件对象 Class c2 = Person.class;

//获取构造器对象

Constructor con2 = c2.getConstructor(String.class,int.class);

//创建对象 con2.newInstance(\李四\ } }

//用来测试反射的类 class Person { private String name; private int age; public Person(){}; public Person(String name,int age) { this.name = name; this.age = age; System.out.println(name+\ } }

////////////////////////////////////////////////////// \/*

题目:

编写一个类,增加一个实例方法,用于打印一条字符串, 并使用反射手段创建该类的对象,并调用对象的方法。 思路: 1、通过Class.forName()方法获取字节码文件对象 2、获取构造器对象 3、创建对象 4、获取成员方法对象 */

import java.lang.reflect.Constructor; import java.lang.reflect.Method; class Test { public static void main(String[] args) throws Exception {

//获取字节码文件对象

Class c = Class.forName(\//获取构造器对象

Constructor con = c.getConstructor(); //创建对象

Object obj = con.newInstance();

//获取成员方法对象 Method m = c.getMethod( \ m.invoke(obj); } }

class Demo { public Demo(){} public void sayHello( ) {

System.out.println(\这是打印的方法\ } }

//////////////////////////////////////////////////////// \/*

题目: 编写程序,生成5个1至10之间的随机整数,存入一个List集合, 编写方法对List集合进行排序(自定义排序算法,禁用Collections.sort 方法和TreeSet),然后遍历集合输出。 思路: 1、用Math的random()方法生成五个随机整数 2、用ArrayList集合存储随机数

3、遍历ArrayList集合并对其排序 4、遍历输出 */

import java.util.ArrayList;

class Test { public static void main(String[] args) {

//创建ArrayList集合

ArrayList list = new ArrayList();

//用循环的方式,生成五个随机整数并存入ArrayList集合中 for(int i = 0; i < 5; i ++) { //生成随机整数 int rand = (int)(Math.random() * 10 ) + 1; }

//向List集合添加元素 list.add(rand);

//冒泡排序,外层控制对比次数 for(int i = 0; i < list.size() - 1; i ++) { //内存控制比较过程 for(int k = 0;k < list.size() - i - 1; k ++) { //调整顺序 if(list.get(k) > list.get(k+1)) { int max = list.get(k); list.set( k ,list.get(k + 1)); list.set( k + 1 ,max); } } }

//遍历集合 for(int i = 0; i < list.size(); i ++) { System.out.println(list.get(i)); } } }

//////////////////////////////////////////////////////// \

/*

题目: 接收用户输入的一句英文,将其中的单词以反序输出。例如: “I love you” →\思路: 1、获取用户输入,调用String的split()方法用空格将其分割成 字符串数组 2、遍历这个字符串数组,通过StringBuffer构造方法,将 字符串数组转换成StringBuffer对象,并调用reverse() 方法, 将字符串倒序 3、通过String的构造方法再将StringBuffer对象转换成String 并输出该新字符串 */

import java.util.Scanner;

class Test { public static void main(String[] args) { //创建Scanner对象 Scanner sc = new Scanner(System.in); System.out.println(\请输入您要反序输出的一句英文:\ //获取控制台输入 String line = sc.nextLine();

//将其用空格分割成字符串数组 String[] lines = line.split(\

System.out.println(\反序输出的结果:\//遍历字符串数组

for(int i = 0; i < lines.length; i ++) {

//将数组中的字符串转换成StringBuffer对象 StringBuffer sb = new StringBuffer(lines[i]);

//通过StringBuffer对象的reverse()方法得到反序单词 String newStr = new String(sb.reverse()) ; //直接输出反序单词 System.out.print(newStr+\ } System.out.println(); } }

//////////////////////////////////////////////////////// \/*

题目:

编写一个可以获取文件扩展名的函数。形参接收一个文件名字符串,返回一个扩展字符串。 思路: 1、用String类的lastIndexOf(string s) 方法获取最后一个点的位置 2、根据用String的substring(开始索引,结束索引)取得扩展名 */

import java.util.Scanner;

class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in);

System.out.println(\请输入文件名:\ String filename = sc.nextLine(); String extend = getExtend(filename); }

public static String getExtend(String filename) { //取得最后一个点的索引 int beginindex = filename.lastIndexOf(\ int endindex = filename.length();

//根据用String的substring(开始索引,结束索引)取得扩展名 String extend = filename.substring(beginindex + 1, endindex); return extend; } }

//////////////////////////////////////////////////////// \/*

题目: 用ArrayList存入Student自定义对象,Student类有name,age两个属性 按照age倒序排序。 思路: 1、创建ArrayList集合,并向集合中添加Student对象 2、新建一个Comparator比较器接口的实现类,重写compare方法, 按年龄倒序排序 3、调用Collections的sort方法传入Comparator比较器实现类 */

import java.util.ArrayList; import java.util.Iterator; import java.util.Collections; import java.util.Comparator; class Test

{ }

public static void main(String[] args) { //创建集合 ArrayList list=new ArrayList(); }

//向集合中添加元素

list.add(new Student(\张三\list.add(new Student(\李四\list.add(new Student(\王二\

//调用Collections的sort方法进行排序 Collections.sort(list, new MyComparator()); //遍历集合

Iterator it=list.iterator(); while(it.hasNext()) { Student s=(Student)it.next(); System.out.println(\}

//实现了Comparator比较器接口的自定义类

class MyComparator implements Comparator { @Override public int compare(Student s1 ,Student s2) { //按年龄排序,从大到小 int num = s2.getAge() - s1.getAge(); return num; } }

//标准学生类 class Student { private String name; private int age; Student(){} Student(String name,int age) { this.name=name; this.age=age; } // set和get方法 public void setName( String name )

{ this.name=name; } public String getName() { return this.name; } public void setAge( int age ) { this.age=age; } public int getAge() { return this.age; } }

//////////////////////////////////////////////////////// \/*

题目: 编程列出一个字符串的全部字符组合情况。原始字符串中没有重复字符。 例如: 原始字符串是“abc”,打印得到下列所有组合情况: “a” “b” “c” \ \ \ \ \ \ *思路:

*1,发现组合的最小长度是单个字符,且就是原始字符串的每个字符,而最长长度则和字符串一样

*2,每行新组合都是在前一行旧组合的基础上,将每个旧组合与原始字符串中每个不同字符单独组合一次,获得新组合

*3,新一行组合有多少个,无法马上确定,因为都是字符串,

* 所以可以先用StringBuilder接收每个新组合,最后再切割获得每个新组合 * */

public class Test {

public static void main(String[] args) { //调用方法,传入字符串 show(\ }

//编写方法,接收字符串

public static void show(String str){

//将原始字符串转成原始字符数组 char[] chs=str.toCharArray();

//获得原始字符串数组,即每个字符串只有一个字符 String[] strs=chsToStrs(chs);

//按指定格式输出原始字符串数组,即单个字符的组合情况 printString(strs);

//x为每行单个字符串的长度,第一行已经输出,所以从2开始,最长为原始字符串长度,循环输出每行组合

for(int x = 2;x<=str.length();x++){

//调用方法,传入 原始字符数组 和 前一次的字符串数组,获得新的字符串数组

strs=addChar(chs,strs);

//按指定格式输出新的字符串数组 printString(strs); } }

//定义方法,接收 原始字符数组 和 前一次的字符串数组,并返回新字符串数组 public static String[] addChar(char[] chs,String[] oldStrs){

//因为新字符数组长度暂时无法确定,也为了转换方便,所以使用StringBuilder来接收每个新字符串

StringBuilder sb=new StringBuilder(); //定义新字符串数组 String[] newStrs=null;

//外循环,遍历每个字符串数组 for(int x=0;x

//内循环,遍历每个原始字符,将每个字符串把每个不同字符都单独添加一次

for(int y=0;y

//判断字符串是否包含该字符,通过indexOf()的返回值>=0来确定已包含

if(oldStrs[x].indexOf(chs[y])>=0)

//已包含该字符,则不操作,继续下次循环 continue;

//不包含该字符,则添加该字符 String s=oldStrs[x]+chs[y];

//添加新字符串到StringBuilder对象并用','隔开 sb.append(s).append(','); } }

//删除StringBuilder对象最后的一个',',并转成字符串,再将字符串按','切割,获得新字符串数组

newStrs=sb.deleteCharAt(sb.length()-1).toString().split(\

本文来源:https://www.bwwdw.com/article/k033.html

Top