【问题标题】:How to print a combination of words one from first array the second from second array and third from third array?如何打印第一个数组中的单词组合,第二个数组中的第二个单词和第三个数组中的第三个单词的组合?
【发布时间】:2015-11-07 15:42:34
【问题描述】:

我希望这段代码输出以下内容,它有三个以逗号分隔的数组列表条目作为分隔符("slow,steady"),("blue, white,green")("whale, shark ");。它必须输出以下内容

slow blue whale 
slow white whale 
slow white shark 
steady blue whale 
steady white shark 
and so forth.

我能够将每个单词分开并将它们放在三个单独的列表中。 list1 包含缓慢稳定 list2 包含蓝白色绿色和 list3 包含鲸鲨。但我无法连接它们。欢迎任何输入。

import java.util.StringTokenizer;  
import java.util.ArrayList;
import java.util.List;
import java.util.*;  

public class HelloWorld {    

    String input;   //input String  
    StringBuffer output;  //Holds the output  
    String delimiter = ","; //Delimiter (default comma (,))  
    String arrayOfWords[];  
    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();
    List<String> list3 = new ArrayList<String>();

    int listCount;

    /* 
     * Generates combinations by applying the  
     * concept of recursion 
     */  


    public void generateCombinations(String input, String delimiter,int listCount)   
    {       
          output = new StringBuffer();             
          this.input = input;    
          this.delimiter = delimiter;  
          this.listCount = listCount;

                 String[] stockArr = new String[list1.size()];
                 String[] stockArr1 = new String[list2.size()];
                 String[] stockArr2 = new String[list2.size()];

             if(listCount == 1) {
              String items1[] = input.split(",");
               for(int i=0;i< items1.length; i++){

                 list1.add(items1[i]);
               }

             }

             else if(listCount == 2) {
               String items2[] = input.split(",");
               for(int i=0;i< items2.length; i++){

                 //System.out.println(items2[i]);
                 list2.add(items2[i]);
               }

             }

             else {
              String items3[] = input.split(",");
               for(int i=0;i< items3.length; i++){

                // System.out.println(items3[i]);
                 list3.add(items3[i]);
               }

             }


         stockArr = list1.toArray(stockArr);
         stockArr1 = list2.toArray(stockArr1);
         stockArr2 = list3.toArray(stockArr2);


      for(String s1 : stockArr){

             System.out.print(s1);         
      }        


      for(String s2 : stockArr1){

             System.out.print(s2);     
    }        



      for(String s3 : stockArr2){

             System.out.print(s3);       
      }        


      for(int i=0;i<list1.size();i++){
        String s1 = list1.get(i).toString();
              for(int j=0;j<list2.size();j++){
                    String s2 = list2.get(j).toString();
                     System.out.println(s1+s2);
              }


     }


 }   

    public static void main(String[] args) {    
        ArrayList <String> strings = new ArrayList <String>();
        int i=1;

        for(String string : strings){
        new HelloWorld().generateCombinations(string , ",",i);  
            ++i;
        }

    }    
}   

【问题讨论】:

  • 那么,你想在最后创建一个巨大的字符串吗?
  • 感谢您的回复。我要打印的是:慢蓝鲸——第 1 行慢白鲸——第 2 行,以此类推
  • 有什么规律吗?
  • 感谢Uma Kanth的回复。图案是你在慢蓝鲸慢白鲸慢白鲨稳定蓝鲸稳定白鲨等问题中编辑的。我无法在评论中指定换行符
  • @Shravya 我在不使用您的代码的情况下添加了我的解决方案。请试一试并告诉我。不确定是否要使用递归..

标签: java arrays string combinations


【解决方案1】:

这可以使用嵌套的for 循环来完成。在你的情况下是 3 层。

    stockArr = list1.toArray(stockArr);
    stockArr1 = list2.toArray(stockArr1);
    stockArr2 = list3.toArray(stockArr2);

    for (String a : stockArr) {
        for (String b : stockArr1) {
            for (String c : stockArr2) {
                System.out.println(a + " " + b + " " + c);
            }
        }
    }

此外,如果您使用StringBuilder 连接多个String,它总是会更高效。即

    for (String a : stockArr) {
        for (String b : stockArr1) {
            for (String c : stockArr2) {
                StringBuilder sb = new StringBuilder();
                sb.append(a)
                  .append(" ")
                  .append(b)
                  .append(" ")
                  .append(c);
                System.out.println(sb.toString());
            }
        }
    }

【讨论】:

  • 感谢您的回复。我也添加了第三个 for 循环,但它没有打印三层。它正在打印空白
  • 我会注意到它并非总是性能更高。这取决于具体情况,需要进行基准测试才能准确确定效率。
  • 添加此项以删除空白:sb.append(myWord.replaceAll("\\s+",""))
  • 凌忠尝试了第二个,但没有任何显示
  • 任何输入 people.Tried 此处指定的所有内容。但它没有打印提到的 for 循环。
【解决方案2】:

终于让它运作良好:) 奖励:现在,您需要连接多少个单词并不重要。

import java.util.*;
import java.util.stream.*;

public class Test {

    public static void generateCombinations(ArrayList <String> strings, String delimiter){

        int stringsSize = strings.size();
        int i=0;
        String text = "";
        parseList(text, stringsSize ,i, strings, delimiter);

    }

    public static void parseList(String text, int stringsSize, int i,    ArrayList <String> strings, String delimiter) {
        String stringStream = strings.get(i);
        String[] list = stringStream.split(delimiter);
        if (i==stringsSize-1) {
            for (String string : list){
                System.out.println(text + " " + string.replaceAll("\\s+",""));
            }
        } else {
            for (String string : list){
                String text2 = text + " " + string.replaceAll("\\s+","");
                int j = i+1;
                parseList(text2, stringsSize, j, strings, delimiter);
            }
        }
    }

    public static void main(String[] args) {    
        ArrayList <String> strings = new ArrayList <String>();
        strings.add("slow,steady");
        strings.add("blue, white, green");
        strings.add("whale, shark ");

        generateCombinations(strings , ",");  

    }  
}

结果:

 slow blue whale
 slow blue shark
 slow white whale
 slow white shark
 slow green whale
 slow green shark
 steady blue whale
 steady blue shark
 steady white whale
 steady white shark
 steady green whale
 steady green shark

【讨论】:

  • 感谢您的回复。我试过了。效果很好。递归的概念似乎很适合这里。
  • 没问题。我只有一个问题,当我试图通过 for 循环打印代码时,我无法弄清楚我的代码有什么问题。任何想法。可能是列表每次都被重新初始化为 null 吗?
【解决方案3】:

试试这个

  public static void main(String[] args) {

    List<String[]> afterSplit = new ArrayList<String[]>();
    afterSplit.add("slow, steady".split(","));
    afterSplit.add("blue, white, green".split(","));
    afterSplit.add("whale, shark ".split(","));
    for (int i = 0; i < afterSplit.get(0).length; i++) {
        for (int j = 0; j < afterSplit.get(1).length; j++) {
            for (int k = 0; k < afterSplit.get(2).length; k++) {
                System.out.println(afterSplit.get(0)[i].trim() + " "
                        + afterSplit.get(1)[j].trim() + " "
                        + afterSplit.get(2)[k]);

            }
        }

    }

}

【讨论】:

  • 这个也可以。但是如果只有三个字符串。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2022-11-16
相关资源
最近更新 更多