A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2013-7-7 15:02  /  8209 人查看  /  182 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习一下
回复 使用道具 举报
抱着试试看的态度做了下,勉强做了第二、三题,不知道是否符合要求,但是对复习巩固确实很有效。第一题还是不会啊,还请多多指教哦。

          第二题:求出1-100之间的素数,假设有n个,将这些素数存入a[n+1]的数组中。(其中n个是求出的各个素数,还有一个是随机添加其中的一个素数)
这样数组中就有相同的两个素数,写一个搜索算法,找出数组中相同的那个素数。(随机添加的素数,可手动指定,也可利用随机方法产生)

package com.itheima;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
/*思路:
* 1.求1到100之间的素数,首先应该有一个判断某数是否为素数的方法。
* 2.因为素数的个数n不确定,而要将其存放于数组,但是数组长度是固定的,如直接定义数组,
* 其长度无法准确定义,但是想到集合是可变长度的,且ArrayList可转换为数组,故使用
* ArrayList先存放数组元素,再转换为int数组。
* 3.要在素数数组中随机插入一个素数,可使用ArrayList的add(int index, E element) 方法,
* 其添加位置index有Random类随机产生。而添加的素数由手动键盘输入。
* 4.查找相同的那个素数可由两个for语句嵌套遍历数组得到。
*/
public class TestTwo {
/**
  * @param args
  * @throws Exception
  */
public static void main(String[] args) throws Exception {
  
  //调用getPrimeToList方法。得到素数对应Integer组成的ArrayList集合
  ArrayList<Integer> al = primeToList();
  //调用listToArray(ArrayList<Integer> al)方法,将al转换成int[];
  int[] arr = listToArray(al);//如输入的不是数字,会产生异常
  String prime = getAlikeEle(arr);
  System.out.println(prime);

}
//获取相同的素数,
public static String getAlikeEle(int[] arr){
  for(int x=0;x<arr.length-2;x++){
   for(int y=x+1;y<arr.length-1;y++){
    if(arr[x]==arr[y])
     return "相同的素数"+arr[x]+"位于素数表的"+x+"位置和"+y;
       //该处的素数表值得是按从小到大排列的100以内的素数表
   }
  }
  return -1+"";
}

//在ArrayList集合中随机插入录入的素数,并返回一个Object数组
public static int[] listToArray(ArrayList<Integer> al)throws Exception{
  //产生一个位于在al角标内的随机数,用于指定素数插入的位置
  int r = new Random().nextInt(al.size()-1);
  
  //创建键盘输入流,读取键盘录入的素数的字符串表示形式。
  BufferedReader bufr =
    new BufferedReader(new InputStreamReader(System.in));
  
  //读取键盘录入,去除两端空格。
  String line = bufr.readLine().trim();
  //如果输入为null,或者不是纯数字,报异常
  if((line==null) && (line.matches("\\d{1,3}")))
   throw new RuntimeException("输入的不是数字");
  //将int类型的字符串转换为Integer对象
  Integer insertPrime = Integer.valueOf(line);
  
  //判断输入的数字是否为1到100间的素数,如不是直接报异常
  int a = insertPrime;
  if(a<1 || a>100 || !(TestTwo.isPrime(a)))
   throw new RuntimeException("输入的素数不是1到100间的素数");
  
  
  //将输入的素数随机插入al集合中
  al.add(r, insertPrime);
  
  //遍历Object[]将其转换为int数组
  int[] arr = new int[al.size()];
  for(int i=0;i<al.size();i++){
   arr = al.get(i);
  }
  return arr;
}


//获取1到100内的素数,并存放到一个ArrayList集合中
public static ArrayList<Integer> primeToList(){

  //创建ArrayList,并加范型,只允许存入Integer类型的对象
  ArrayList<Integer> al = new ArrayList<Integer>();
  for(int x=2;x<100;x++){ //因1和100都不是素数,故不作判断
   if(TestTwo.isPrime(x))
    al.add(x); //自动装箱,x封装为Integer
  }
  if(al.size()==0)
   return null; //如果al为null,表示1到100之间无素数
  return al;  
}

/*判断一个数是否为素数的方法
  *参考素数判定的“埃拉托斯特尼筛法”,检查一个正整数N是否为素数,
  *最简单的方法就是试除法,将该数N用小于等于根号N的所有素数去试除,若均无法整除,则N为素数
  */
public static boolean isPrime(int num){
  if(num<=1)
   return false; //1不是素数,负数不考虑

  int x = (int) Math.ceil(Math.sqrt(num));
  for(int i=2;i*i<=x;i++){
   if(num%i==0)
    return false; //num有1和其本身以外的因子,故不是素数
  }
  return true; //num没有1和其本身以外的因子,故不是素数
}
}


         第三题:在一个文件夹内有文件夹和文件,文件名的格式为:数字+名称.java。
  要求:把所有的.java文件复制一份,变为文件名格式为:数字+名称+数字.java。
(其中数字是相对应的,名称由字母组成。如:01Demo.java——>01Demo01.java)

package com.itheima;
import java.io.*;
/*
* 思路分析:
*1.复制.java文件用FileReader和FileWriter,可加BufferedReader和BufferedWriter提高效率。
*2. 同时因为只复制.java文件,需要进行文件过滤,用File对象的
*  File[] listFiles(FilenameFilter filter) 方法获取.java文件对象。
* 这里不采用获取文件名的方式,因为要判断.java文件不是目录,而是文件,同时在读取流读取的时候也可直接使用。
*3.获取文件名前面的数字,加到原文件名的.java前面。
*4.将数据写到新文件名对应的目标文件中
*/
public class TestThree {
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  File file = new File("F:\\");
  if(!(file.exists()&&file.isDirectory()))
   throw new NullPointerException("路径有误"); //如给定的文件夹不存在,抛异常
  
  //new一个本类对象调用复制文件的方法
  new TestThree().copyJava(file);
}
//实现.java文件复制的方法,此方法只能实现复制后的文件仍处于原文件夹内
public void copyJava(File file){
  //获取.java文件对象,需传入一个过滤器,并将对象存入一个File数组中
  File[] files = file.listFiles(new FilterByJava());

  //定义读取流和写入流,因操作文本文件,用字符流缓冲区提高效率
  BufferedReader bufr = null;
  BufferedWriter bufw = null;

  //for循环实现对每一个.java文件的读写
  for(File srcFile : files){
   
   if(srcFile.isDirectory()) //如果srcFile是一个后缀为.java的目录
    continue;    //不再复制,而继续遍历下一个文件。
   
   //获取复制的目的地,并用正则表达式获取写入目的地的字符串表示,即copyName
   String[] sfile = srcFile.getAbsolutePath().split("\\.");
   String copyName = sfile[0].replaceAll("((\\d+)(.)+)","$1$2")+".java";   
   File desFile = new File(copyName);
   
   try{   
    bufr = new BufferedReader(new FileReader(srcFile));
    bufw = new BufferedWriter(new FileWriter(desFile));
    String line = null;
   
    //频繁的读写操作
    while((line=bufr.readLine())!=null){
     bufw.write(line);
     bufw.newLine();
     bufw.flush();
    }
   }
   catch(IOException e){
    throw new RuntimeException("文件复制失败!");
   }
   finally{
    try {
     if(bufw!=null)
      bufw.close();
    }
    catch (IOException ex1) {
      // TODO Auto-generated catch block
      throw new RuntimeException("写入流关闭异常");
    }
    finally{
     if(bufr!=null)
      try{
       bufr.close();
      }
      catch(IOException ex2){
       throw new RuntimeException("读取流关闭异常");
      }
    }
   }
  }
}
}
/**按文件名过滤.java文件
* */
class FilterByJava implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
  // TODO Auto-generated method stub
  return name.endsWith(".java");
}

}

itheima.zip

3.83 KB, 阅读权限: 100, 下载次数: 0

点评

第二题编译出错。。。代码请放入这个“<>”东西里边  发表于 2013-7-9 01:23

评分

参与人数 1技术分 +2 收起 理由
神之梦 + 2 第三题的

查看全部评分

回复 使用道具 举报
刘张朋 发表于 2013-7-8 15:04
抱着试试看的态度做了下,勉强做了第二、三题,不知道是否符合要求,但是对复习巩固确实很有效。第一题还是 ...

可能是贴进去的时候什么地方弄错了
  1. package com.itheima;

  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.Random;

  5. /*思路:
  6. * 第二题:求出1-100之间的素数,假设有n个,将这些素数存入a[n+1]的数组中。(其中n个是求出的各个素数,还有一个是随机添加其中的一个素数)
  7. * 这样数组中就有相同的两个素数,写一个搜索算法,找出数组中相同的那个素数。(随机添加的素数,可手动指定,也可利用随机方法产生)
  8. * 1.求1到100之间的素数,首先应该有一个判断某数是否为素数的方法。
  9. * 2.因为素数的个数n不确定,而要将其存放于数组,但是数组长度是固定的,如直接定义数组,
  10. * 其长度无法准确定义,但是想到集合是可变长度的,且ArrayList可转换为数组,故使用
  11. * ArrayList先存放数组元素,再转换为int数组。
  12. * 3.要在素数数组中随机插入一个素数,可使用ArrayList的add(int index, E element) 方法,
  13. * 其添加位置index有Random类随机产生。而添加的素数由手动键盘输入。
  14. * 4.查找相同的那个素数可由两个for语句嵌套遍历数组得到。

  15. */

  16. public class TestTwo {

  17. /**
  18. * @param args
  19. * @throws Exception
  20. */
  21. public static void main(String[] args) throws Exception {

  22. //调用getPrimeToList方法。得到素数对应Integer组成的ArrayList集合
  23. ArrayList<Integer> al = primeToList();
  24. //调用listToArray(ArrayList<Integer> al)方法,将al转换成int[];
  25. int[] arr = listToArray(al);//如输入的不是数字,会产生异常
  26. String prime = getAlikeEle(arr);
  27. System.out.println(prime);

  28. }
  29. //获取相同的素数,
  30. public static String getAlikeEle(int[] arr){
  31. for(int x=0;x<arr.length-2;x++){
  32. for(int y=x+1;y<arr.length-1;y++){
  33. if(arr[x]==arr[y])
  34. return "相同的素数"+arr[x]+"位于素数表的"+x+"位置和"+y;
  35. //该处的素数表值得是按从小到大排列的100以内的素数表
  36. }
  37. }
  38. return -1+"";
  39. }

  40. //在ArrayList集合中随机插入录入的素数,并返回一个Object数组
  41. public static int[] listToArray(ArrayList<Integer> al)throws Exception{
  42. //产生一个位于在al角标内的随机数,用于指定素数插入的位置
  43. int r = new Random().nextInt(al.size()-1);

  44. //创建键盘输入流,读取键盘录入的素数的字符串表示形式。
  45. BufferedReader bufr =
  46. new BufferedReader(new InputStreamReader(System.in));

  47. //读取键盘录入,去除两端空格。
  48. String line = bufr.readLine().trim();
  49. //如果输入为null,或者不是纯数字,报异常
  50. if((line==null) && (line.matches("\\d{1,3}")))
  51. throw new RuntimeException("输入的不是数字");
  52. //将int类型的字符串转换为Integer对象
  53. Integer insertPrime = Integer.valueOf(line);

  54. //判断输入的数字是否为1到100间的素数,如不是直接报异常
  55. int a = insertPrime;
  56. if(a<1 || a>100 || !(TestTwo.isPrime(a)))
  57. throw new RuntimeException("输入的素数不是1到100间的素数,请核准后输入");


  58. //将输入的素数随机插入al集合中
  59. al.add(r, insertPrime);

  60. //遍历Object[]将其转换为int数组
  61. int[] arr = new int[al.size()];
  62. for(int i=0;i<al.size();i++){
  63. arr[i] = al.get(i);
  64. }
  65. return arr;
  66. }


  67. //获取1到100内的素数,并存放到一个ArrayList集合中
  68. public static ArrayList<Integer> primeToList(){

  69. //创建ArrayList,并加范型,只允许存入Integer类型的对象
  70. ArrayList<Integer> al = new ArrayList<Integer>();
  71. for(int x=2;x<100;x++){ //因1和100都不是素数,故不作判断
  72. if(TestTwo.isPrime(x))
  73. al.add(x); //自动装箱,x封装为Integer
  74. }
  75. if(al.size()==0)
  76. return null; //如果al为null,表示1到100之间无素数
  77. return al;
  78. }

  79. /*判断一个数是否为素数的方法
  80. *参考素数判定的“埃拉托斯特尼筛法”,检查一个正整数N是否为素数,
  81. *最简单的方法就是试除法,将该数N用小于等于根号N的所有素数去试除,若均无法整除,则N为素数
  82. */
  83. public static boolean isPrime(int num){
  84. if(num<=1)
  85. return false; //1不是素数,负数不考虑

  86. int x = (int) Math.ceil(Math.sqrt(num));
  87. for(int i=2;i<=x;i++){
  88. if(num%i==0)
  89. return false; //num有1和其本身以外的因子,故不是素数
  90. }
  91. return true; //num没有1和其本身以外的因子,故不是素数
  92. }
  93. }
复制代码
回复 使用道具 举报
刘张朋 发表于 2013-7-9 08:39
可能是贴进去的时候什么地方弄错了

我错了,以前的代码的60行和61行,在测试时如果直接按enter或者输入字母不是按我想的那样执行的,下面是修改后的代码,[code]package com.itheima;

import java.io.*;
import java.util.ArrayList;
import java.util.Random;

/*思路:
* 第二题:求出1-100之间的素数,假设有n个,将这些素数存入a[n+1]的数组中。(其中n个是求出的各个素数,还有一个是随机添加其中的一个素数)
* 这样数组中就有相同的两个素数,写一个搜索算法,找出数组中相同的那个素数。(随机添加的素数,可手动指定,也可利用随机方法产生)
* 1.求1到100之间的素数,首先应该有一个判断某数是否为素数的方法。
* 2.因为素数的个数n不确定,而要将其
回复 使用道具 举报
刘张朋 发表于 2013-7-9 08:39
可能是贴进去的时候什么地方弄错了

我错了,以前代码在60行和61的,如果直接按enter和输入字母不是按我想的那样执行的,下面是修改后的代码:
  1. package com.itheima;

  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.Random;

  5. /*思路:
  6. * 第二题:求出1-100之间的素数,假设有n个,将这些素数存入a[n+1]的数组中。(其中n个是求出的各个素数,还有一个是随机添加其中的一个素数)
  7. * 这样数组中就有相同的两个素数,写一个搜索算法,找出数组中相同的那个素数。(随机添加的素数,可手动指定,也可利用随机方法产生)
  8. * 1.求1到100之间的素数,首先应该有一个判断某数是否为素数的方法。
  9. * 2.因为素数的个数n不确定,而要将其存放于数组,但是数组长度是固定的,如直接定义数组,
  10. * 其长度无法准确定义,但是想到集合是可变长度的,且ArrayList可转换为数组,故使用
  11. * ArrayList先存放数组元素,再转换为int数组。
  12. * 3.要在素数数组中随机插入一个素数,可使用ArrayList的add(int index, E element) 方法,
  13. * 其添加位置index有Random类随机产生。而添加的素数由手动键盘输入。
  14. * 4.查找相同的那个素数可由两个for语句嵌套遍历数组得到。

  15. */

  16. public class TestTwo {

  17. /**
  18. * @param args
  19. * @throws Exception
  20. */
  21. public static void main(String[] args) throws Exception {

  22. //调用getPrimeToList方法。得到素数对应Integer组成的ArrayList集合
  23. ArrayList<Integer> al = primeToList();
  24. //调用listToArray(ArrayList<Integer> al)方法,将al转换成int[];
  25. int[] arr = listToArray(al);//如输入的不是数字,会产生异常
  26. String prime = getAlikeEle(arr);
  27. System.out.println(prime);

  28. }
  29. //获取相同的素数,
  30. public static String getAlikeEle(int[] arr){
  31. for(int x=0;x<arr.length-2;x++){
  32. for(int y=x+1;y<arr.length-1;y++){
  33. if(arr[x]==arr[y])
  34. return "相同的素数"+arr[x]+"位于素数表的"+x+"位置和"+y;
  35. //该处的素数表值得是按从小到大排列的100以内的素数表
  36. }
  37. }
  38. return -1+"";
  39. }

  40. //在ArrayList集合中随机插入录入的素数,并返回一个Object数组
  41. public static int[] listToArray(ArrayList<Integer> al)throws Exception{
  42. //产生一个位于在al角标内的随机数,用于指定素数插入的位置
  43. int r = new Random().nextInt(al.size()-1);

  44. //创建键盘输入流,读取键盘录入的素数的字符串表示形式。
  45. BufferedReader bufr =
  46. new BufferedReader(new InputStreamReader(System.in));

  47. //读取键盘录入,去除两端空格。
  48. String line = bufr.readLine().trim();
  49. //如果输入为null,或者不是纯数字,报异常
  50. if((line=="") ||! (line.matches("\\d{1,3}")))
  51. throw new RuntimeException("输入的不是数字");
  52. //将int类型的字符串转换为Integer对象
  53. Integer insertPrime = Integer.valueOf(line);

  54. //判断输入的数字是否为1到100间的素数,如不是直接报异常
  55. int a = insertPrime;
  56. if(a<1 || a>100 || !(TestTwo.isPrime(a)))
  57. throw new RuntimeException("输入的素数不是1到100间的素数,请核准后输入");


  58. //将输入的素数随机插入al集合中
  59. al.add(r, insertPrime);

  60. //遍历Object[]将其转换为int数组
  61. int[] arr = new int[al.size()];
  62. for(int i=0;i<al.size();i++){
  63. arr[i] = al.get(i);
  64. }
  65. return arr;
  66. }


  67. //获取1到100内的素数,并存放到一个ArrayList集合中
  68. public static ArrayList<Integer> primeToList(){

  69. //创建ArrayList,并加范型,只允许存入Integer类型的对象
  70. ArrayList<Integer> al = new ArrayList<Integer>();
  71. for(int x=2;x<100;x++){ //因1和100都不是素数,故不作判断
  72. if(TestTwo.isPrime(x))
  73. al.add(x); //自动装箱,x封装为Integer
  74. }
  75. if(al.size()==0)
  76. return null; //如果al为null,表示1到100之间无素数
  77. return al;
  78. }

  79. /*判断一个数是否为素数的方法
  80. *参考素数判定的“埃拉托斯特尼筛法”,检查一个正整数N是否为素数,
  81. *最简单的方法就是试除法,将该数N用小于等于根号N的所有素数去试除,若均无法整除,则N为素数
  82. */
  83. public static boolean isPrime(int num){
  84. if(num<=1)
  85. return false; //1不是素数,负数不考虑

  86. for(int i=2;i*i<=num;i++){
  87. if(num%i==0)
  88. return false; //num有1和其本身以外的因子,故不是素数
  89. }
  90. return true; //num没有1和其本身以外的因子,故不是素数
  91. }
  92. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
神之梦 + 2 注意代码排版

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马