急求!谢谢大侠们!
使用控制语句将2维字符型数组s[row][2]变成几个1维数组:
如将{{a,b},{b,c},{b,d},{c,d},{d,e},{g,h}}转化为{a,b,c,d,e} {a,b,d,e} {g,h}
又如{{"001","002"},{"001","003"},{"002","003"},{"004","005"}} 转化为 {"001","002","003"} {"001","003"} {"004","005"}
使用控制语句将2维字符型数组s[row][2]变成几个1维数组:
如将{{a,b},{b,c},{b,d},{c,d},{d,e},{g,h}}转化为{a,b,c,d,e} {a,b,d,e} {g,h}
又如{{"001","002"},{"001","003"},{"002","003"},{"004","005"}} 转化为 {"001","002","003"} {"001","003"} {"004","005"}
a,b},{b,c},{b,d},{c,d},{d,e},{g,h}}转化为{a,b,c,d,e} {a,b,d,e} {g,h}
我比较笨,没有看出“转化”的规则是什么。
请以后提问题时,描述你究竟想做什么,说得越详细越好。否则你的问题大家没有办法解决。
比较2位数组中每两个子数组的前一个字符和后一个字符,如果相等就将这个链放入令一个数据结构中比如{a,b}和{b,c}比较后放入{a,b,c}, {b,c}和{c,d}比较后发现{c,d}是这个链式接着的发展趋势,于是把d再放入形成{a,b,c,d},{c,d}和{d,e}将e放入{a,b,c,d,e}
谢谢达人求解
我再说具体点吧
这是我毕业设计中遇到的一道问题,我的毕业设计有关于灾害的链式管理。
这个具体意义是这样的这个2维数组中的每一个字符代表一个灾害的编号,如a。
而每一个子数组代表一个灾害之间的引发关系,如{a,b}代表着灾害a引发了灾害b。
这样在这个2维数组中就有很多灾害引发关系,如{a,b}代表灾害a引发了灾害b,{b,c}代表灾害b引发了灾害c,{c,d}代表灾害c引发了灾害d。这里明显就有着这样一个链式关系,即a引发b引发c引发d,于是将它们放入一个1维数组中(或一个其它数据结构中,如VECTOR),形成了一个灾害链式{a,b,c,d}.谢谢各位大侠了,小弟等
可用warshall算法。程序如下:
public class Warshall {// s数组表示灾害之间引发关系
static char[][] s={{'a','b'},{'b','c'},{'b','d'},{'c','d'},{'d','e'},{'g','h'}};
//pos数组表示一共有多少个不同的灾害:下标0-第一个灾害,下标1-第二个灾害
static int[] pos={'a','b','c','d','e','g','h'};
//数组b是求最终的灾害关系的传递闭包。即:所有的灾害链。此时全为false
//数组b也就是最终结果
static boolean[][] b=new boolean[pos.length][pos.length];
//对数组b初始化。按照数组s来进行。
private static void init()
{
for(int i=0; i<s.length;i++)
{
b[index(s[i][0])][index(s[i][1])]=true;
//含义:两维数组b中,若'a'与'b'有灾害关系,则b['a']['b']填true。无关是false.
b[i][i]=true;//关系的自己性
}//for(i)
}
// 求关系a的传递闭包
public static void warshall(boolean[][] a)
{
for(int i=0;i<=a.length-1;i++)
{
for(int j=0;j<=a.length-1;j++)
{
if(a[j][i]==true)
{
for(int k=0;k<=a.length-1;k++)
{
a[j][k]=a[j][k] | a[i][k];
}//for(k)
}//if
}//for(j)
}//for(i)
}//warshall
//打印出最终结果
public static void print(boolean[][] a)
{
for(int i=0;i<a.length;i++)
{
System.out.print("灾害:"+(char)pos[i]+" 所引发的灾害链是:{");
for(int j=0;j<a.length;j++)
{
if(a[i][j]==true){
System.out.print((char)pos[j]+" ");
}
}//for(j)
System.out.print("} \n");
}//for(i)
}
//返回字符ch在数组pos中的下标
private static int index(char ch)
{
for(int i=0;i<pos.length;i++)
{
if(pos[i]==ch)
{ return i; }
}
return -1;
}
public static void main(String[] args) {
init(); //对数组b初始化。
warshall(b);//求出所有的灾害链
print(b);//打印出所求的结果
}}
程序运行的结果如下:
灾害:a 所引发的灾害链是:{a b c d e }
灾害:b 所引发的灾害链是:{b c d e }
灾害:c 所引发的灾害链是:{c d e }
灾害:d 所引发的灾害链是:{d e }
灾害:e 所引发的灾害链是:{e }
灾害:g 所引发的灾害链是:{g h }
灾害:h 所引发的灾害链是:{}
public class Warshall {// s数组表示灾害之间引发关系
static char[][] s={{'a','b'},{'b','c'},{'b','d'},{'c','d'},{'d','e'},{'g','h'}};
//pos数组表示一共有多少个不同的灾害:下标0-第一个灾害,下标1-第二个灾害
static int[] pos={'a','b','c','d','e','g','h'};
//数组b是求最终的灾害关系的传递闭包。即:所有的灾害链。此时全为false
//数组b也就是最终结果
static boolean[][] b=new boolean[pos.length][pos.length];
//对数组b初始化。按照数组s来进行。
private static void init()
{
for(int i=0; i<s.length;i++)
{
b[index(s[i][0])][index(s[i][1])]=true;
//含义:两维数组b中,若'a'与'b'有灾害关系,则b['a']['b']填true。无关是false.
}//for(i)
for(int i=0;i<b.length;i++)
{
b[i][i]=true;//关系的自反性
}
}
// 求关系a的传递闭包
public static void warshall(boolean[][] a)
{
for(int i=0;i<=a.length-1;i++)
{
for(int j=0;j<=a.length-1;j++)
{
if(a[j][i]==true)
{
for(int k=0;k<=a.length-1;k++)
{
a[j][k]=a[j][k] | a[i][k];
}//for(k)
}//if
}//for(j)
}//for(i)
}//warshall
//打印出最终结果
public static void print(boolean[][] a)
{
for(int i=0;i<a.length;i++)
{
System.out.print("灾害:"+(char)pos[i]+" 所引发的灾害链是:{");
for(int j=0;j<a.length;j++)
{
if(a[i][j]==true){
System.out.print((char)pos[j]+" ");
}
}//for(j)
System.out.print("} \n");
}//for(i)
}
//返回字符ch在数组pos中的下标
private static int index(char ch)
{
for(int i=0;i<pos.length;i++)
{
if(pos[i]==ch)
{ return i; }
}
return -1;
}
public static void main(String[] args) {
init(); //对数组b初始化。
warshall(b);//求出所有的灾害链
print(b);//打印出所求的结果
}}
程序运行结果如下:
灾害:a 所引发的灾害链是:{a b c d e }
灾害:b 所引发的灾害链是:{b c d e }
灾害:c 所引发的灾害链是:{c d e }
灾害:d 所引发的灾害链是:{d e }
灾害:e 所引发的灾害链是:{e }
灾害:g 所引发的灾害链是:{g h }
灾害:h 所引发的灾害链是:{h }
我要的结果不是把所有的灾害为起点的链取出来 而是将一个一个单独的不包含的链取出
比如您的结果中{a b c d e}就包含{b c d e} {c d e } {d e} { e }这5个链其实就是{a b c d e}这一个链
而您的结果中不包含我要的另一条链{a b d e}
还是非常感谢您 但是这个逻辑确实不好弄 您做的我都弄不好 呵呵
希望您再帮我个忙
也希望大家帮忙 谢谢了
import java.util.ArrayList;
import java.util.Iterator;public class Pizza {
String[][]sr;
ArrayList<ArrayList> rvList=new ArrayList<ArrayList>();
public void reverseArray(String[][]sr){
this.sr=sr;
for(int i=0;i<sr.length;i++){
if(isHead(i)){
ArrayList<String> list=new ArrayList<String>();
reverseloop(i,list);
}
}
}
private void reverseloop(int index,ArrayList<String> alist){
if(alist.size()==0){
alist.add(sr[index][0]);
}
alist.add(sr[index][1]);
if(isTail(index)){
rvList.add(alist);
return ;
}
for(int i=0;i<sr.length;i++){
if(i!=index){
if(sr[i][0].equals(sr[index][1]) ){
ArrayList<String> a=new ArrayList<String>();
a.addAll(alist);
reverseloop(i,a);
}
}
}
}
private boolean isHead(int index){
for(int i=0;i<sr.length;i++){
if(i!=index){
if(sr[i][1].equals(sr[index][0])){
return false;
}
}
}
return true;
}
private boolean isTail(int index){
for(int i=0;i<sr.length;i++){
if(i!=index){
if(sr[i][0].equals(sr[index][1])){
return false;
}
}
}
return true;
}
public static void main(String[] args) {
//String[][] ss={{"b","d"},{"c","d"},{"d","e"},{"g","h"},{"a","b"},{"b","c"}};
String[][] ss={{"001","002"},{"001","003"},{"002","003"},{"004","005"}} ;
Pizza s=new Pizza();
s.reverseArray(ss);
for (Iterator iter = s.rvList.iterator(); iter.hasNext();) {
ArrayList<String> element = (ArrayList<String>) iter.next();
for (Iterator iterator = element.iterator(); iterator.hasNext();) {
String element1 = (String) iterator.next();
System.out.print(element1+" " );
}
System.out.println();
}
System.out.println(s.rvList.size());
}
}
到现在,我还是不明白:将{{a,b},{b,c},{b,d},{c,d},{d,e},{g,h}}转化为{a,b,c,d,e} {a,b,d,e} {g,h} 中的{a,b,d,e}是怎么转化出来的?
看为我比较笨。
楼上javaflee说他的程序达到你的要求。你多看看吧。因为我看不懂。转换规则我还是不大明白。
{{a,b},{b,c},{b,d},{c,d},{d,e},{g,h}}转化为{a,b,c,d,e} {a,b,d,e} {g,h}
分解为:
{{a,b},{b,c}, 转化为{a,b,c}
{{a,b},{b,c},{b,d}, 转化为{a,b,c} {a,b,d}
{{a,b},{b,c},{b,d},{c,d}, 转化为{a,b,c,d} {a,b,d}
{{a,b},{b,c},{b,d},{c,d},{d,e} 转化为{a,b,c,d,e} {a,b,d,e}
{{a,b},{b,c},{b,d},{c,d},{d,e},{g,h}}转化为{a,b,c,d,e} {a,b,d,e} {g,h} 同理{{"001","002"},{"001","003"},{"002","003"},{"004","005"}} 转化为 {"001","002","003"} {"001","003"} {"004","005"}
解决步骤分析如下:1 ,根据关联关系可以将所给集合划分为若干个子集合,这些子集合之间没有关联关系。
2 ,在每个集合中找到可以做为根节点的元素(也就是第一个元素按照字母表最靠前的,可能有不止一个),以此元素做为
根节点建立二叉树(如 jayflee 所说,可能存在循环)。
3 ,结果就是所有二叉树的所有分支的集合。个人观点,仅供参考