黑马程序员技术交流社区

标题: 关于迭代的问题 [打印本页]

作者: 沈艳南    时间: 2013-5-9 22:25
标题: 关于迭代的问题
本帖最后由 沈艳南 于 2013-5-15 21:50 编辑

/符数串,String s=”ABC”,输出为:A,B,C,AB,AC,BC,ABC  求解决  希望可以写上标注.
作者: zms2100    时间: 2013-5-9 22:58
给思路吧,用String类的toCharArray方法,返回的是存储A、B、C的数组char[]数组,然后你就根据数组角标等去组合成不同的字符串(这只是我的第一感觉思路),仅供参考。
作者: 、__WSD吴少东    时间: 2013-5-9 23:04
唔,迭代不就是对集合的遍历么?   感觉这个不是迭代的问题...
作者: HM刘博    时间: 2013-5-9 23:15
本帖最后由 HM刘博 于 2013-5-9 23:41 编辑

  1. class StringDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. String s = "ABC";

  6. char[] arr = s.toCharArray();//将字符串转换成数组

  7. PaiLie(arr);
  8. }
  9. public static void PaiLie(char[] arr)
  10. {
  11. String s = "";
  12. for (int x=0;x<arr.length ;x++ )//遍历数组中的每一个元素
  13. {
  14. System.out.print(s+arr[x]+",");//将数组中元素单个输出
  15. }
  16. for (int y=0;y<arr.length-1 ;y++ )//遍历数组,索引位置只到数组长度减2位置
  17. {
  18. if (y==0)//判断索引是否为0,如果是0就输出以A开头的两个字母的组合
  19. {
  20. System.out.print(s+arr[y]+arr[y+1]+","+arr[y]+arr[y+2]+",");//输出两个字母的组合
  21. }
  22. else
  23. {
  24. System.out.print(s+arr[y]+arr[y+1]+",");//输出以B开头的两个字母的组合
  25. }

  26. }
  27. for (int x=0;x<arr.length ;x++ )//对数组进行遍历,将三个字母组合输出
  28. {
  29. s+=arr[x];
  30. }
  31. System.out.println(s);//打印三个字母的组合
  32. }
  33. }
复制代码
打印结果:



现在上基础班就学到这了,这个方法有点白痴,但是结果打印出来了,等待大神的高效率的方法。。。

2.png (5.41 KB, 下载次数: 1)

2.png

作者: 沈艳南    时间: 2013-5-10 00:18
不好意思更正错误  是用递归方法.不下心写错了.sorry
作者: 沈艳南    时间: 2013-5-10 00:20
、__WSD吴少东 发表于 2013-5-9 23:04
唔,迭代不就是对集合的遍历么?   感觉这个不是迭代的问题...

呵呵 我写错了 不好意思  是递归方法
作者: 沈艳南    时间: 2013-5-10 00:21
HM刘博 发表于 2013-5-9 23:15
打印结果:

谢谢  很详细
作者: 刘胜寒    时间: 2013-5-10 10:17
问题如果以解决,请及时修改分类,否则继续提问问,谢谢合作!
作者: 飞鸟青崖    时间: 2013-5-10 11:05
昨天遇到一个和这类似的,当时没有用到递归。今天就把递归的方法放你这吧。
  1. import java.util.ArrayList;
  2. class MyTest {        
  3.         public static ArrayList<String> als = new ArrayList<String>();
  4.         static int shu = 0;
  5.         /**shu:记录每一次新产生的字符串的个数,
  6.         如已知所有由3个字符所组成的字符串,在得到所有4个字符组成的字符串时,
  7.         shu记录的就是4个字符组成的字符串的个数。*/
  8.         public static void main(String[] args) {
  9.                 char[] ch = {'a','b','c','d','e','f','g'};
  10.                 int[] jiu = new int[ch.length*ch.length];
  11.                 ArrayList<String> ts = zuHe(ch,ch.length,jiu);
  12.                 //ArrayList<String> ts = paiLie(ch,ch.length);
  13.                 for(String str:ts){
  14.                                 System.out.println(str);
  15.                 }
  16.         }

  17.         /**
  18.                 获取给定字符数组中元素的组合。
  19.                 思路:
  20.                         用一个数组记录某一个字符串中最后一个元素所在的下标,则下一次进行加运算的时候,
  21.                 直接从这个下标处开始。如{'a','b','c'},得到对字符串ab进行加运算时,记录的应该是'b'的下标1,
  22.                 而ab加的第一个元素应该是1+1处的字符。
  23.                 传入的n代表获取最大由几个字符组成的字符串。
  24.         */
  25.         private static ArrayList<String> zuHe(char[] ch,int n,int[] jiu) {
  26.                 int[] jishu = new int[ch.length*(ch.length-1)];
  27.                 if(n>=1)
  28.                 {
  29.                         int xia = 0;//记录下标的数组的下标
  30.                         als = zuHe(ch,--n,jiu);
  31.                         if(n ==0)
  32.                         {
  33.                                 for(int x = 0;x<ch.length;x++){
  34.                                         als.add(ch[x]+"");
  35.                                         jishu[xia++] = x;
  36.                                         shu++;
  37.                                         fu(jishu,jiu);                                       
  38.                                         }
  39.                         }                        
  40.                         else
  41.                         {
  42.                                 int size = als.size();
  43.                                 /**因为在循环中还对集合添加数据,所以需要把集合中原有的长度记录下来。
  44.                                 把y定义在外面是为了在循环中定义shu = 0,xia =0;。
  45.                                 每进行一次下面的循环就意味着对集合中新添加的元素进行加运算。所以shu = 0,
  46.                                 xia = 0.
  47.                                 */
  48.                                 int y1 = size - shu,y;
  49.                                 for(y=size-shu,shu =0,xia = 0;y<size;y++)
  50.                                         {
  51.                                                 for(int x = jiu[y-y1]+1;x<ch.length;x++)
  52.                                                 {
  53.                                                         als.add(als.get(y)+ch[x]);
  54.                                                         /*
  55.                                                         由于这里对jishu进行了操作,所以需要用另一个数组来记录它原有的值,
  56.                                                         这个数组就是jiu。
  57.                                                         */
  58.                                                         jishu[xia++]=x;
  59.                                                         shu++;
  60.                                                 }
  61.                                         }
  62.                                         xia = 0;
  63.                                         fu(jishu,jiu);
  64.                         }
  65.                 }
  66.                 return als;
  67.         }
  68.         private static void fu(int[] jishu,int[] jiu){//赋值,但不使后者指向前者。
  69.                 for(int x=0;x<jishu.length;x++){
  70.                         jiu[x]=jishu[x];
  71.                 }
  72.         }
  73. }
复制代码

作者: 沈艳南    时间: 2013-5-10 21:37
明白了 谢谢各位
作者: eycrckag    时间: 2013-5-11 19:38
跌代可以这样取吗?我好像没有学到呢
作者: 杨修    时间: 2013-5-11 22:27
先用toCharArray()方法将字符串转化为一个数组,然后就能得到了你需要的单个字符了;
再根据用字符串连接的功能“+”就能得到你需要的两个字符组成的字符串了;
定义一个空字符串String s = "";用"+"和字符或者字符串运算就能得到你需要的结果了;






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2