2016-10-06 11 views
0

このプログラムの出力は正常に動作します。しかし、実装できなかったことが1つあります。場合によっては、1または2の列または行が1つもありません。時には、2つ以上の行/列があり、同じ "最多"の数を持っています。しかし、私のプログラムは1行/ 1列しか返しません。ランダムに生成された2進行列の最大数が1の行と列の検索

私は2つ以上の行/列が1の同じ最高の数を持っている場合が必要です。両方の行が表示されます。例えば「最大1:1,2の行」、または列の場合は「1:1,2の行」と言うことができます。

私はこれに助けが必要です。私は立ち往生している。私は別のアプローチ、あなたは再びすべての2D配列をループする必要がありますか、なぜ最初の事をお勧めし

import java.util.Random; 
    import java.util.Scanner; 

    public class LargestRowColumn 
    { 
     // declare a 2 dimensional array or an array of arrays 
     private static int[][] randArray; 

     public static void main(String[] args) 
     { 
     do 
     { 
      // Create a scanner to get Input from user. 
      Scanner scanner = new Scanner(System.in); 
      System.out.print("\nEnter the array size n:"); 
      int rows = scanner.nextInt(); 
      int cols = rows; 

      randArray = new int[rows][cols]; 

      // loop through the number of rows in thw array 
      for (int i = 0; i < randArray.length; i++) 
      { 
      // loop through the elements of the first array in the array 
      for (int j = 0; j < randArray[0].length; j++) 
      { 
       // set a random int 0-1 to the array 
       randArray[i][j] = getRandomInt(0, 1); 
       // print the number just assigned 
       System.out.print(randArray[i][j]); 
      } 
      // make a linebreak each row. 
      System.out.println(); 
      } 
      System.out.print("Row(s) with the most 1's: " + scanRow(randArray) + "\n"); 
      System.out.print("Columns(s) with the most 1's: " + scanColumn(randArray) + "\n"); 
     } 
     while(true); 
     } 

     // quick method I made to get a random int with a min and max 
     public static int getRandomInt(int min, int max) 
     { 
      Random rand = new Random(); 
      return rand.nextInt(max-min+1)+min; 
     } 


     public static int scanRow(int[][] array) 
     { 
      int result = -1; 
      int highest = -1; 

      for (int row = 0; row < array.length; row++)// Here we are about start looping through the matrix values 
      { 
      int temp = 0; // Setting the first index to 0. 
      for (int col = 0; col < array[row].length; col++)// 
      { 
       //Assign current location to temporary variable 
       temp = temp + array[row][col]; 
      } 

      if (temp > highest) 
      { 
       highest = temp; 
       result = row + 1; 
      } 
      } 
      return result; 
     } // end of row method 

     private static int scanColumn(int[][] array) 
     { 
      int result = -1; 
      int highest = -1; 

      // declare and initialize the variable(here you've 'created' it, to then call it on if statement) 
      int col = 0; 

      for (int row = 0; row < array.length; row++) 
      { 
       int temp = 0; 
       //declare the variable in the for loop 
       for (col = 0; col < array[row].length; col++) 
       { 
        //Assign current location to temp variable 
        temp = temp + array[row][col]; 
       } 

       if (temp > highest) 
       { 
        highest = temp; 
       result = col; 
       } 
      } 
      return result; 
     } 


    } 

答えて

0

、uが(それらを挿入しながら、行と列で最高の1つのを把握し、配列にそれらを挿入することができます行の配列と列の配列)キャリーはscore(1の数)とindex(行または列の番号)の2つのパラメータを持つクラスであるカスタムタイプになり、次に配列と最高得点に関連する指標を印刷する。

入力を使って配列を受け取ることを期待している場合は、新しいループで同じことをすることができます。

ので、あなたのインサートループはこの

 List<Wrapper> rowsList = new ArrayList<Wrapper>(rows); 
     List<Wrapper> colsList = new ArrayList<Wrapper>(cols); 
     for(int i=0;i<cols;i++) { 
      colsList.add(new Wrapper(i,0)); 
     } 
     // loop through the number of rows in thw array 
     for (int i = 0; i < rows; i++) 
     { 
     int sum =0; 
     // loop through the elements of the first array in the array 
     for (int j = 0; j < cols j++) 
     { 

      // set a random int 0-1 to the array 
      randArray[i][j] = getRandomInt(0, 1); 
      // print the number just assigned 
      System.out.print(randArray[i][j]); 
      sum+=randArray[i][j];//add for row 
      colsList.get(j).setScore(colsList(j).getScore() +randArray[i][j]);//add for column 
     } 
      rowsList.add(new Wrapper(i,sum)); 
     // make a linebreak each row. 

     } 

    Collections.sort(rowsList,new Comparator<Wrapper>() { 

       @Override 
       public int compare(Wrapper obj1,Wrapper obj2) { 
        if(obj1.getScore() > obj2.getScore()) 
         return -1; 
        if(obj1.getScore() < obj2.getScore()) 
         return 1; 
        return 0; 
      } 
     }); 
     if(rowsList.isEmpty()) 
      return -1; 
     int max = rowsList.get(0).getScore(); 
     for(Wrapper obj:rowsList) { 
      if(obj.getScore()< max) 
       break; 
      System.out.println(obj.getIndex); 
      } 
     //DO THE SAME FOR COLUMNS 

のようになりますあなたのラッパークラスは、これは、配列のOPの使用と一致している

  public class Wrapper { 
       private int index; 
       private int score; 

       public Wrapper(int index,int score) { 
         this.index = index; 
         this.score = score; 
       } 

       public int getIndex() { 
         return this.index; 
       } 

       public int getScore() { 
         return this.score; 
        } 

       public void setScore(int score) { 
         this.score = score 
        } 
       } 
0

になります。

int(1行)を返す代わりに、int[]を返すことができます。

個人的には、配列内の行数に合わせてint[]を初期化します。なぜなら、すべての行が同じ数の1を持つ場合です。代わりに、列の追加の

int[] results = new int[array[0].length]; 

そして、私は行を追加するためにどの地点を指定するために使用される変数を持っているでしょうに、すなわち、 results[0]

int index = 0; 

そして、すべてがかかっています配列に結果をどのように追加するかを微調整します。

public static int[] scanRow(int[][] array) 
     { 
      int highest = -1; 
      int index = 0; //ADD HERE 
      int[] results = new int[array[0].length]; //ADD HERE 

      ... //Your code here 

      if (temp > highest) 
      { 
       highest = temp; 
       //CLEAR THE RESULT LIST 
       for(int x = 0; x < results.length; x++){ 
        results[x] = -1; 
       } 
       index = 0; //RESET THE INDEX 
       results[index] = row + 1; 
       index ++; 
      } else if (temp == highest{ 
       highest = temp; 
       results[index] = row + 1; 
       index ++; 
      } 
      } 
      return results; 
     } // end of row method 

個人的に、私はそれを使用してそれを行うだろうどのようにHERESに、物事のこれらのタイプのためのArrayListを使用します。

私はメソッドの戻り値の型をArrayList<int>にします。文はclear()add()方法としてArrayListいるので、扱いが少し楽にしている場合

public static ArrayList<int> scanRow(int[][] array) 

その後、私のArrayList<int>

ArrayList<int> results = new ArrayList<>(); 

と宣言。

if (temp > highest) 
{ 
    highest = temp; 
    //CLEAR THE RESULT LIST 
    results.clear(); 
    results.add(row+1); 
} else if (temp == highest{ 
    highest = temp; 
    results.add(row + 1); 
} 

EDIT は、それに応じてprint文を編集することを忘れないでください。

関連する問題