2012-05-30 3 views
1

내가 String[,] matrix 함께하기로 결정 다음console.writeLine (매트릭스) bidimensional 배열 문자열 []

00 node1 node2 node3 
node1 0 1  0 
node2 1 1  1 
node3 0 0  0 

같은 행렬을 구축있다. 다음 코드는 내가 원했던 행렬을 얻을 수 있기를 기대했지만 컴파일 할 때 "노드 i"와 "노드 j"만 인쇄합니다.

public AdjMatrix(ArrayList nodeList,ArrayList linkList) 
     { 
      String[,] matrix = new String [nodeList.Count,nodeList.Count]; 
      ArrayList result = new ArrayList(); 

      using (StreamWriter writer = new StreamWriter("C:\\Users\\Martina\\Desktop\\matrix.txt")) 
      { 
       Console.SetOut(writer); 


       //inizializzazione dei nomi delle classi 
       for (int i = 0; i < nodeList.Count; i++) 
       { 
        if (i == 0) 
        { 
         matrix[i,0]=(""); 
        } 
        else 
        { 
         foreach (EA.Element node in nodeList) 
         { 
          matrix[i,0] = node.Name; 
         } 
         Console.WriteLine("la riga della matrice" + matrix[i,0]); 
        } 
       } 

       //inizializzazione dei valori della matrice 
       for (int j = 0; j < nodeList.Count; j++) 
       { 
        if (j==0) 
        { 
         matrix[0,j]=(""); 
        } 
        else 
        { 
         foreach (EA.Element node in nodeList) 
         { 
          matrix[0,j] = node.Name; 
         } 
         Console.WriteLine("la riga della matrice" + matrix[0,j]); 
        } 
       } 


       //definizione dell'esistenza del link 
       foreach (EA.Connector link in linkList) 
       { 
        for (int i = 1; i < nodeList.Count; i++) 
        { 
         int supplier = link.SupplierID; 
         int client = link.ClientID; 

         String supplierNode = modelRepository.GetElementByID(supplier).Name; 
         String clientNode = modelRepository.GetElementByID(client).Name; 


         if (supplierNode.Equals((String)matrix[i,0])) 
         { 
          for (int j = 1; j < nodeList.Count; j++) 
          { 
           if (clientNode.Equals((String)matrix[0,j])) 
           { 
            matrix[i,j] = "1"; 
           } 
           else 
           { 
            matrix[i,j] = "0"; 
           } 
          } 
         } 
        } 
       } 


       Console.WriteLine("matrix : "); 
      for (int i = 0; i < nodeList.Count; i++) 
      { 
       for (int j = 0; j < nodeList.Count; j++) 
        Console.Write(matrix[i, j] + "\t"); 
        Console.WriteLine(); 
      } 
      } 
     } 

적어도 노드의 이름을 출력하지 못하는 이유는 무엇입니까? 내가 잘못 찾지 못하는 이유는 무엇입니까? 도움 주셔서 감사합니다.

노드 목록에서 내가 문자열이며, 내가 클라이언트 요소와 내 노드와 공급자의 요소를 비교할 수 있도록 linkList는 커넥터 요소를 포함하는 노드의 이름을 얻는다.

+0

2D 배열에는 행이 있고 각 행에는 열이 있으며 각 열에 값이 저장되며 * for 루프 *가 해결할 수없는 것은 없습니다 – Shai

+0

2 차원이 아닌 ArrayList의 ArrayList를 사용하는 이유가 있습니까? 부울 배열? 이름에 대해서는 단순히 두 개의 사전을 추가하여 이름에서 색인을 가져올 수 있습니다. 그러면 많은 양의 메모리가 절약됩니다. –

+0

@Defi 나는 이것을 고려하기 위해 내 의견을 편집했습니다 :-) –

답변

1

좋아요, 코드를 다시 살펴보면서 나는 당신이하는 일과 당신이하고 싶은 일이 서로 다른 것을 깨닫게되었습니다. 원하는 것은 배열의 배열입니다. 가지고있는 것은 배열의 배열입니다 ...

코드를보세요. matrix는 ArrayList이고 각 노드에 대해 새 ArrayList를 행렬에 추가합니다. 이 시점에서 당신은 이미 2 차원을 가지고 있습니다. 모든 노드에 대한 ArrayList를 행렬에 추가하는 동안 새로 만든 ArrayList를 통해 이동하고 각 노드에 대해 다른 ArrayList를 추가합니다. 그래서 결국 (n2) +1 개의 ArrayLists가 있습니다. 여기서 n은 노드의 수입니다. 그리고 당신이 그것을 원하지 않는다고 확신합니다 :-)

다시 간단한 bool [] []을 사용하고 사전에서 노드 이름을 가져 오는 것이 좋습니다. 또는 bool을 잘라내 지 않으면 가중치 연결 행렬에 float [] []를 사용할 수 있습니다.

+0

행렬의 전체 코드를 검토하기 시작했고, 한 arraylist 너무 많이. 주의 해 주셔서 감사합니다, 당신은 나를 많이 돕고 있습니다, 많이 감사합니다. 나는 그것을 고치려고 노력할 것이다. 나는 그것이 효과가 있기를 바랍니다. – Defi

+0

내 대답을 올바르게 표시하면 다음과 같이 표시됩니다 .-D –

0

그래서 올바르게 이해하면 ArrayList가 포함되어 있습니다. matrix [i]의 내용을 문자열로 변환하면 작동하지 않습니다. 그것을 처음에 행렬 [i] [0]으로 바꾸어서 어떻게되는지 말해보십시오.

+0

아, 이제 ArrayList에서 ArrayList를 가져 와서 String으로 캐스팅 한 다음이 문자열에서 첫 번째 [0] char을 선택한다는 것입니다. 그것은 차례로 명시 적으로 문자열로 형변환되어야합니다. 그러나 이것이 여러분이 원하는 것이 아니기 때문에'string node = (string) matrix [i] [0]; '라고 쓰면됩니다. –