java字符数组全排列造句问题

Aaron9979215 2016-02-04 01:02:52
现有若干个字符串数组如下,
1.我,你们,他
2.购买,租了,用掉,花了
3.100元,玫瑰花,宝箱,戒指

每个字符串数组表示在句子中1,号,2号,3号等位置可能出现的词。

用上述3组字符串组可生成如下句子,
我购买100元。
你们租了宝箱。
他用掉戒指。
。。。。

小弟现在用ArrayList<ArrayList<String>>去存储这些字符串数组,数组数和数组里边的字符串数都是不定的,现在想用这些词生成所有可能的句子,请教各位大神指点如何实现?
...全文
286 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aaron9979215 2016-02-06
  • 打赏
  • 举报
回复
引用 9 楼 rickylin86 的回复:

import java.util.ArrayList;

//用JAVA 1.7或者1.7以上版本.其他版本自行修改.
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import static java.nio.file.StandardOpenOption.*;
import java.nio.channels.WritableByteChannel;
import java.io.IOException;
import java.nio.ByteBuffer;
 
public class Test{
	@SuppressWarnings("unchecked")
    public static void main(String[] args){
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("我");
        list1.add("你们");
        list1.add("他");
 
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("购买");
        list2.add("租了");
        list2.add("用掉");
        list2.add("花了");
 
        ArrayList<String> list3 = new ArrayList<>();
        list3.add("100元");
        list3.add("玫瑰花");
        list3.add("宝箱");
        list3.add("戒指");
 
        process(list1,list2,list3);
    }
	
	@SuppressWarnings("unchecked")
    private static void process(ArrayList<String> ... lists){
        assert lists.length >= 1;
        String[] result = new String[lists.length];
        process(result,0,lists);
    }
 
	@SuppressWarnings("unchecked")
    private static void process(String[] result,int i,ArrayList<String> ... lists){
        assert lists.length >= 1;
        assert result.length == lists.length;
        if(i == result.length){
            saveToFile(result);
            return;
        }
 
            for(String str : lists[i]){
                result[i] = str;
                process(result,i + 1,lists);
            }
    }
 
    private static void saveToFile(String[] result){
		String content = "";
		for(String str : result){
			content += str;
		}
		content += System.lineSeparator();
		try(WritableByteChannel channel = Files.newByteChannel(path,CREATE,APPEND);){
			ByteBuffer buffer = ByteBuffer.wrap(content.getBytes());
			channel.write(buffer);
		}catch(IOException e){
			e.printStackTrace();
			return;
		}
	}

	private static Path path = Paths.get(System.getProperty("user.dir")).resolve("to.txt");//保存到当前目录下的to.txt文件中.
}
啥都不说了,大牛!!!上分~~~~
三仙半 2016-02-05
  • 打赏
  • 举报
回复
Sorry,把楼主的意思理解错了。下面这个是用ArrayList<ArrayList<String>>存储原始数据,然后用递归思路实现的方案,返回值也是ArrayList<ArrayList<String>>,需要时再组装成String即可。

import java.util.ArrayList;

/**
 * @author ZhengYesheng
 */
public class SentenceMaker
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		ArrayList<String> list1 = new ArrayList<>();
		list1.add("我");
		list1.add("你们");
		 list1.add("他");

		ArrayList<String> list2 = new ArrayList<>();
		list2.add("购买");
		list2.add("租了");
		 list2.add("用掉");
		 list2.add("花了");

		ArrayList<String> list3 = new ArrayList<>();
		 list3.add("100元");
		 list3.add("玫瑰花");
		list3.add("宝箱");
		list3.add("戒指");

		ArrayList<ArrayList<String>> origin = new ArrayList<ArrayList<String>>();
		origin.add(list1);
		origin.add(list2);
		origin.add(list3);

		ArrayList<ArrayList<String>> result = make(origin);
		for (int i = 0; i < result.size(); i++)
		{
			System.out.println(result.get(i));
		}
	}

	public static ArrayList<ArrayList<String>> make(ArrayList<ArrayList<String>> origin)
	{
		ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
		if (origin.size() == 1)
		{
			ArrayList<String> origin0 = origin.get(0);
			for (int i = 0; i < origin0.size(); i++)
			{
				ArrayList<String> tmp = new ArrayList<String>();
				tmp.add(origin0.get(i));
				result.add(tmp);
			}
		}
		else
		{
			ArrayList<String> origin0 = origin.remove(0);
			ArrayList<ArrayList<String>> subResult = make(origin);
			for (int i = 0; i < origin0.size(); i++)
			{
				String strOrigin = origin0.get(i);
				for (int j = 0; j < subResult.size(); j++)
				{
					ArrayList<String> aSubResult = copyArrayList(subResult.get(j));
					aSubResult.add(0, strOrigin);
					result.add(aSubResult);
				}
			}
		}
		return result;
	}

	private static ArrayList<String> copyArrayList(ArrayList<String> origin)
	{
		ArrayList<String> result = new ArrayList<String>();
		for (int i = 0; i < origin.size(); i++)
		{
			result.add(origin.get(i));
		}
		return result;
	}
}
imfang 2016-02-05
  • 打赏
  • 举报
回复
也凑凑热闹

import java.util.ArrayList;
 
public class Test{
	static void process(int index,String m,ArrayList<ArrayList<String>> list)
	{
		ArrayList<String>l=list.get(index);
		int s=list.size()-index;
		for(String e:l)
		{
			String tmp=m+e;
			if(s==1)System.out.println(tmp);
			else process(index+1,tmp, list);
		}
	}
    public static void main(String[] args){
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("我");
        list1.add("他");
 
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("购买");
        list2.add("租了");
 
        ArrayList<String> list3 = new ArrayList<>();
        list3.add("100元");
        list3.add("玫瑰花");
 
        ArrayList<ArrayList<String>> list=new ArrayList<>();
        list.add(list1);
        list.add(list2);
        list.add(list3);
        
        process(0,"",list);
 
    
    }
}
运行结果: 我购买100元 我购买玫瑰花 我租了100元 我租了玫瑰花 他购买100元 他购买玫瑰花 他租了100元 他租了玫瑰花
Aaron9979215 2016-02-05
  • 打赏
  • 举报
回复
引用 11 楼 rui888 的回复:
7 楼用的递归,和1楼结果一样。
要实现通用性的结果,是必须要用递归
Aaron9979215 2016-02-05
  • 打赏
  • 举报
回复
引用 10 楼 rickylin86 的回复:
你是打算做伪原创吗?
?什么是伪原创啊 这是小弟搞论文遇到的问题
tony4geek 2016-02-05
  • 打赏
  • 举报
回复
7 楼用的递归,和1楼结果一样。
rickylin86 2016-02-05
  • 打赏
  • 举报
回复
你是打算做伪原创吗?
rickylin86 2016-02-05
  • 打赏
  • 举报
回复

import java.util.ArrayList;

//用JAVA 1.7或者1.7以上版本.其他版本自行修改.
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import static java.nio.file.StandardOpenOption.*;
import java.nio.channels.WritableByteChannel;
import java.io.IOException;
import java.nio.ByteBuffer;
 
public class Test{
	@SuppressWarnings("unchecked")
    public static void main(String[] args){
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("我");
        list1.add("你们");
        list1.add("他");
 
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("购买");
        list2.add("租了");
        list2.add("用掉");
        list2.add("花了");
 
        ArrayList<String> list3 = new ArrayList<>();
        list3.add("100元");
        list3.add("玫瑰花");
        list3.add("宝箱");
        list3.add("戒指");
 
        process(list1,list2,list3);
    }
	
	@SuppressWarnings("unchecked")
    private static void process(ArrayList<String> ... lists){
        assert lists.length >= 1;
        String[] result = new String[lists.length];
        process(result,0,lists);
    }
 
	@SuppressWarnings("unchecked")
    private static void process(String[] result,int i,ArrayList<String> ... lists){
        assert lists.length >= 1;
        assert result.length == lists.length;
        if(i == result.length){
            saveToFile(result);
            return;
        }
 
            for(String str : lists[i]){
                result[i] = str;
                process(result,i + 1,lists);
            }
    }
 
    private static void saveToFile(String[] result){
		String content = "";
		for(String str : result){
			content += str;
		}
		content += System.lineSeparator();
		try(WritableByteChannel channel = Files.newByteChannel(path,CREATE,APPEND);){
			ByteBuffer buffer = ByteBuffer.wrap(content.getBytes());
			channel.write(buffer);
		}catch(IOException e){
			e.printStackTrace();
			return;
		}
	}

	private static Path path = Paths.get(System.getProperty("user.dir")).resolve("to.txt");//保存到当前目录下的to.txt文件中.
}
Aaron9979215 2016-02-04
  • 打赏
  • 举报
回复
因分数限制,只加到了100
Aaron9979215 2016-02-04
  • 打赏
  • 举报
回复
引用 6 楼 rickylin86 的回复:
正确答案应该是下面这个.

import java.util.ArrayList;

public class Test{
	public static void main(String[] args){
		ArrayList<String> list1 = new ArrayList<>();
		list1.add("我");
		list1.add("你们");
		list1.add("他");

		ArrayList<String> list2 = new ArrayList<>();
		list2.add("购买");
		list2.add("租了");
		list2.add("用掉");
		list2.add("花了");

		ArrayList<String> list3 = new ArrayList<>();
		list3.add("100元");
		list3.add("玫瑰花");
		list3.add("宝箱");
		list3.add("戒指");

		process(list1,list2,list3);
		System.out.println(count);
	}

	private static void process(ArrayList<String> ... lists){
		assert lists.length >= 1;
		String[] result = new String[lists.length];
		process(result,0,lists);
	}


	private static void process(String[] result,int i,ArrayList<String> ... lists){
		assert lists.length >= 1;
		assert result.length == lists.length;
		if(i == result.length){
			count ++;
			for(String str : result){
				System.out.print(str);
			}
			System.out.println();
			return;
		}

			for(String str : lists[i]){
				result[i] = str;
				process(result,i + 1,lists);
			}
	}

	private static int count = 0;
}
谢谢大神! 无耻地再追问一句,能否给代码把生成的所有句子都保存为外部文档,叩谢了,追加30分!
rickylin86 2016-02-04
  • 打赏
  • 举报
回复
正确答案应该是下面这个.

import java.util.ArrayList;

public class Test{
	public static void main(String[] args){
		ArrayList<String> list1 = new ArrayList<>();
		list1.add("我");
		list1.add("你们");
		list1.add("他");

		ArrayList<String> list2 = new ArrayList<>();
		list2.add("购买");
		list2.add("租了");
		list2.add("用掉");
		list2.add("花了");

		ArrayList<String> list3 = new ArrayList<>();
		list3.add("100元");
		list3.add("玫瑰花");
		list3.add("宝箱");
		list3.add("戒指");

		process(list1,list2,list3);
		System.out.println(count);
	}

	private static void process(ArrayList<String> ... lists){
		assert lists.length >= 1;
		String[] result = new String[lists.length];
		process(result,0,lists);
	}


	private static void process(String[] result,int i,ArrayList<String> ... lists){
		assert lists.length >= 1;
		assert result.length == lists.length;
		if(i == result.length){
			count ++;
			for(String str : result){
				System.out.print(str);
			}
			System.out.println();
			return;
		}

			for(String str : lists[i]){
				result[i] = str;
				process(result,i + 1,lists);
			}
	}

	private static int count = 0;
}
rickylin86 2016-02-04
  • 打赏
  • 举报
回复
刚测试了下。修改下。晚点贴答案.
rickylin86 2016-02-04
  • 打赏
  • 举报
回复

import java.util.ArrayList;

public class Test{
	public static void main(String[] args){
		ArrayList<String> list1 = new ArrayList<>();
		list1.add("我");
		list1.add("你们");
		list1.add("他");

		ArrayList<String> list2 = new ArrayList<>();
		list2.add("购买");
		list2.add("租了");
		list2.add("用掉");
		list2.add("花了");

		ArrayList<String> list3 = new ArrayList<>();
		list3.add("100元");
		list3.add("玫瑰花");
		list3.add("宝箱");
		list3.add("戒指");

		process(list1,list2,list3);
	}

	private static void process(ArrayList<String> ... lists){
		assert lists.length >= 1;
		String[] result = new String[lists.length - 1];
		process(result,0,lists);
	}


	private static void process(String[] result,int i,ArrayList<String> ... lists){
		assert lists.length >= 1;
		assert result.length == lists.length - 1;
		if(i == lists.length - 1){
			String total = "";
			for(String str : result){
				total += str;
			}
			for(String value : lists[i]){
				System.out.println(total + value);
			}
			return;
		}


		for(int index = i ; index < lists.length ; index ++){
			for(String value : lists[i]){
				result[i] = value;
				process(result,i+1,lists);
			}
		}
	}
}
Aaron9979215 2016-02-04
  • 打赏
  • 举报
回复
引用 1 楼 rui888 的回复:
你这个不是全排列 吧。
public static void main(String[] args) {
		String[] s1 = { "我", "你们", "他" };
		String[] s2 = { "购买", "租了", "用掉", "花了" };
		String[] s3 = { "100元", "玫瑰花", "宝箱", "戒指" };
		for (int i = 0; i < s1.length; i++) {
			for (int j = 0; j < s2.length; j++) {
				for (int k = 0; k < s3.length; k++) {
					System.out.println(s1[i] + s2[j] + s3[k]);
				}
			}
		}

	}
不是全排列,但也不是三重循环,因为字符串数组的个数是不确定的,我上边只是写了3个数组,实际可能有多个数组。 我现在是想写个通用的,就是不管有多少个数组,每个数组里有多少个词语,都能生成所有可能的句子。 可以仔细看我帖子最后一段的话。
三仙半 2016-02-04
  • 打赏
  • 举报
回复
楼上正解,就是一个三重循环而已。
tony4geek 2016-02-04
  • 打赏
  • 举报
回复
你这个不是全排列 吧。
public static void main(String[] args) {
		String[] s1 = { "我", "你们", "他" };
		String[] s2 = { "购买", "租了", "用掉", "花了" };
		String[] s3 = { "100元", "玫瑰花", "宝箱", "戒指" };
		for (int i = 0; i < s1.length; i++) {
			for (int j = 0; j < s2.length; j++) {
				for (int k = 0; k < s3.length; k++) {
					System.out.println(s1[i] + s2[j] + s3[k]);
				}
			}
		}

	}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧