2013-12-13 3 views
2

Итак, у меня есть назначение в классе, чтобы написать метод, который возвращает местоположение самого большого элемента в 2D-массиве. Возвращаемое значение представляет собой массив 1D, который содержит два элемента, которые указывают строку и столбец самого большого элемента 2D-массива.проблемы с двумерным массивом

public static void main(String[] args) { 
    int[] loc=new int[2]; 
    Scanner scan=new Scanner(System.in); 
    int x,y; 
    System.out.print("Enter the size of your two-dimensional array. Length then height: "); 
    x=scan.nextInt(); 
    y=scan.nextInt(); 
    double [][]matrix=new double[x][y]; 
    System.out.println("Enter your two-dimensional array row by column: "); 
    for (int i=0;i<y;i++){ 
     for (int j=0;j<x;j++){ 
      matrix[j][i]=scan.nextDouble(); 
      System.out.print("i: "+i+" j: "+j + " "); 
     } 
     System.out.println(); 
    } 
    System.out.println(); 
    for (int i = 0; i<x; i++){ 
     for (int j = 0; j<y; j++){ 

      System.out.print(matrix[i][j] + ("i: "+i+" j: "+j + " ")); 

     } 
     System.out.println(); 
    } 
    loc=locateLargest(matrix,x,y); 
     System.out.println(matrix[loc[0]][loc[1]]); 


} 
public static int[] locateLargest(double[][] a ,int x, int y){ 
    int m=0,n=0; 
    int[] location={0,0}; 
    double largest=a[0][0]; 
    for (int i=0;i<x;i++){ 
     for (int j=0;j<y;j++){ 
      System.out.println("X: "+i+" Y: "+j +" value: " + a[i][j]); 
      if (a[i][j]>largest){ 

       location[0]=i; 
       m=i; 
       location[1]=j; 
       n=i; 
      } 
     } 
    } 
    System.out.println("the location of the largest element of you two-dimensional array is : (" + location[0] + ", " + location[1] + ")"); 
    System.out.println(a[m][n]); 
    return location; 
} 

Это мой код. Это довольно неряшливо и, возможно, не имеет большого смысла. Я включил как основной (String [] args), так и мой метод, потому что они необходимы для его настройки. Когда я запускаю его, я получаю неправильный ответ, и я пытаюсь устранить неполадки, распечатав значения (я оставил эти строки печати в своем коде). Ответ, который я получаю, ошибочен. Я верю, что это как-то связано с тем, как вводятся элементы моего массива.

Массив, который я использую, составляет 23,5 35 2 10 4,5 3 45 3,5 35 44,5 9,6, и ответ, который я получаю, равен (2,2), что составляет 5,5, если я читаю его правильно. Значение X равно 3 и Y равно 4.

Любая помощь относительно того, почему мой код возвращает неверный ответ, был бы весьма признателен. Спасибо.

Edit: я добавил значения X и Y.

+0

Не следует 'n = i;' быть 'n = j;'? Почему вы снова используете место? –

+0

Вы также переключаете 'x' и' y' в своих циклах. –

+2

вы переключаете свои индексы в свой шлюз, который читается на входе – Enermis

ответ

0

Вам нужно переназначить переменную largest после найти большее значение в блоке:

 if (a[i][j]>largest){ 
      largest=a[i][j]; //current value is largest 
      location[0]=i; 
      location[1]=j; 
     } 

Удаление переменных m и n, они являются избыточными.

+0

Спасибо за этот шаг. Однако теперь я получаю наибольшее число (45) в неправильном месте (0,2), что возвращает меня к мысли, что я собрал массив неправильно. m и n были для моего устранения неполадок, но теперь я вижу, почему они все еще избыточны даже в этом случае. – Hefflon

+0

@ user3098428 какое значение вы ввели для x и y? –

+0

Что-то может быть неправильно с вашими значениями x и y, получило правильный вывод для вашего массива, добавленный код к моему ответу. –

0

Я думаю, что, как вы использовали петли правильно, чтобы найти наибольшее число, единственная проблема заключается в переназначение из крупнейших не сделано в locateLargest функции,

public static int[] locateLargest(double[][] a ,int x, int y) 
{ 
    int m=0,n=0; 
    int[] location={0,0}; 
    double largest=a[0][0]; 
    for (int i=0;i<x;i++) 
    { 
     for (int j=0;j<y;j++) 
     { 
      System.out.println("X: "+i+" Y: "+j +" value: " + a[i][j]); 
      if (a[i][j]>largest) 
      { 
       location[0]=i; 
       m=i; //Why you need this extra variables 
       location[1]=j; 
       n=i; //Why you need this extra variables 
       largest = a[i][j]; 
      } 
     } 
    } 
    System.out.println("the location of the largest element of you two-dimensional array is : (" + location[0] + ", " + location[1] + ")"); 
    System.out.println(a[m][n]); 
    return location; 
} 
+0

Все еще получаю (0, 2) с 45. Я почти уверен, что проблема в том, как я сейчас устроил массив. – Hefflon

0

вопрос был дан ответ, но я подумайте, что также стоит подумать о том, как вы можете решить эту проблему, не спрашивая о переполнении стека. Даже если ваше задание не просит об этом, я настоятельно рекомендую вам взглянуть на начало разработки Test Driven Development (TDD) - http://www.javaworld.com/article/2073090/testing-debugging/getting-started-with-test-driven-development.html

В отсутствие этого, по крайней мере, попробуйте «уменьшить петлю обратной связи». Например, следующий блок кода позволяет легко (и визуально) создавать тестовые массивы, с которыми вы можете работать (вместо того, чтобы принимать пользовательский ввод каждый раз, когда вы хотите проверить свой код).

Это позволит вам построить 5 немного разных массивов в коде и посмотреть, какие из них не работают, что должно помочь вам понять почему.

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class LargestNumber { 

    public static void main(String[] args){ 
     TableBuilder<Integer> tableBuilder = new TableBuilder<Integer>() 
       .row(1, 2, 3) 
       .row(3, 2, 1) 
       .row(3, 100, 1); 
     print(tableBuilder.build()); 
    } 


    static class TableBuilder<T>{ 
     List<List<T>> table = new ArrayList<List<T>>(); 

     TableBuilder<T> row(T... rowData){ 
      table.add(Arrays.asList(rowData)); 
      return this; 
     } 

     T[][] build(){ 
      T[][] tableAsArray = (T[][]) new Object[table.size()][]; 
      int arrayIndex = 0; 
      for(List<T> row: table){ 
       tableAsArray[arrayIndex++] = (T[])row.toArray() ; 
      } 
      return tableAsArray; 
     } 
    } 

    static void print(Object[][] table){ 
     for(Object[] row:table){ 
      for(Object cell:row){ 
       System.out.print(String.format("%1$" + 5 + "s", cell)); 
      } 
      System.out.println(); 
     } 

    } 
} 
+0

Спасибо за это. Я действительно ценю, что вы добавили больше, чтобы помочь мне, кроме как на вопрос, на который нужно ответить. – Hefflon

Смежные вопросы