2015-03-09 2 views
0

Эй, этот код работает отлично, но его трудно прочитать. Я ищу способ сделать это лучше.Два массива измерений перезаписывают

public void printArray(String[/*row*/][/*column*/] twoDiArray) { 
    if (twoDiArray.length == 2) { 
     for (int i = 0; i < twoDiArray[0].length; i++) { 
      //prints attribute name and value 
      attributeNameAndValue(twoDiArray[0][i],twoDiArray[1][i]); 
     } 
    } else { 
     System.out.println("Does not fit format standards :: 2d array :: two rows max :: first row name :: second row value"); 
    } 
} 

Часть, которую мне очень не нравится, - это вызовы длины в выражении if и цикле for. Есть ли лучший способ сделать это или это просто неаккуратный раздел Java-языка.

+0

Чтобы поместить этот код в контексте, оно является частью XMLWriter проекта, который может создать XML-документы для описания других объектов. –

+0

Я считаю, что это лучше подходит для http://codereview.stackexchange.com/ – mstbaum

ответ

2

У вас есть пар имя-значение, если ваши имена уникальны, вместо этого вы должны использовать Map<String, Integer>. В противном случае создайте свой собственный класс, например. Attribute и использовать List<Attribute>:

public class Attribute { 

    private final String name; 
    private final int value; 

    public Attribute(String name, int value) { 
     this.name = name; 
     this.value = value; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getValue() { 
     return value; 
    } 

} 

Это дает вам время компиляции безопасности для второго измерения. Ваш код будет выглядеть следующим образом:

public void printArray(List<Attribute> attributes) { 
    for (Attribute attribute : attributes) { 
     attributeNameAndValue(attribute.getName(), attribute.getValue()); 
    } 
} 
0

Вы можете использовать новые переменные, чтобы сохранить значение twoDiArray.length и использовать новый вар ниже.

0

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

public void printArray(String[/*row*/][/*column*/] twoDiArray){ 

    if(twoDiArray.length!=2){ 
     System.out.println("Does not fit format standards :: 2d array :: two rows max :: first row name :: second row value"); 
     return; 
    } 
    int len = twoDiArray[0].length; 
    for(int i = 0; i<len.length; i++){ 
     //prints attribute name then value 
     attributeNameAndValue(twoDiArray[0][i],twoDiArray[1][i]); 
    } 
} 

Другое дело было бы изменить attributeNameAndValue принять i и twoDiArray для «аккуратным» вызова.

0

другой способ проверить массив

public void printArray(String[/*row*/][/*column*/] twoDiArray){ 
    assert twoDiArray.length == 2; 
    for(int i=0; i<twoDiArray[0].length; i++){ 
    attributeNameAndValue(kvp[i][0], kvp[i][1]); 
    } 
} 
+0

Оператор утверждения может быть отключен в зависимости от флагов JVM. Если это общедоступный API, рекомендуется бросить 'IllegalArgumentException' со значимым сообщением об ошибке. Если это для внутреннего, его вообще не должно быть - теста должно быть достаточно. В любом случае, в случае DCS_Kurtis_IT_Manager есть распечатка. –

0

Чтобы улучшить читабельность кода применяется условной кода Java (http://www.oracle.com/technetwork/java/codeconvtoc-136057.html). Введем переменные строк и столбцов (по количеству строк и число столбцов)

public void printArray(String[/*row*/][/*column*/] twoDiArray) { 
    int rows = twoDiArray.length; 
    if (rows != 2) { 
     System.out.println("Does not fit format standards :: 2d array :: two rows max :: first row name :: second row value"); 
     return; 
    } 
    int columns = twoDiArray[0].length; 
    for (int column = 0; column < columns; column++) { 
     //prints attribute name then value 
     attributeNameAndValue(twoDiArray[0][column], twoDiArray[1][column]); 
    } 
} 
Смежные вопросы