2015-12-15 8 views
2

Моего профессор выдавал вопрос обзора наших среднесрочный на этой неделю, что я запутался:Удаление строки из рваного массива 2D Струнного и сокращение массива в процессе

Напишите метод, который получает два -мерный (оборванный) массив Строковые объекты и возвращает двумерный (оборванный) массив String объектов, в которых все нулевые записи были удалены. Например, если исходный массив имеет данные (NULL, представляет собой нуль справки):

{"John", null, "Mary", "George", null},{null, "Pete", "Rick"},{null, null, null}}; 

результат, создаваемый метод будет двумерный массивом с тремя рядами.

{"John", "Mary", "George"},{"Pete", "Rick"},{}}; // last row will be empty 

код у меня есть:

public static String[][] removeNull2D(String[][] ragged) { 
    int counter = 0; 
    int nullCounter = 0; 
    String[][] array; // isn't initialized 

    // doesn't work I tested in debugger, need a way to shorten each row by the amount of null values it has 
    for (int i = 0; i < ragged.length; i++) { 
     for (int j = 0; j < ragged[i].length; j++) { 
      if (ragged[i][j] == null) { 
       nullCounter++; 
       for (j = 0; j < ragged[i].length; j++) { 
        array = new String[ragged.length][ragged[i].length - nullCounter]; 
       } 
      } 
     } 
    } 
    // based off 1D array approach 
    for (int i = 0; i < ragged.length; i++) { 
     for (int j = 0; j < ragged[i].length; j++) {   
      if (ragged[i][j] != null) { 
       array[i][counter++] = ragged[i][j]; 
      } 
     } 
    } 
    return ragged; 
} 

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

public static String[] removeNull1D(String[] a) { 
    String[] array = new String[a.length - 1]; 
    int counter = 0; 

    for (int i = 0; i < a.length; i++) { 
     if (a[i] != null) { 
      array[counter++] = a[i]; 
     } 
    } 
    a = array; 
    return array; 
} 

до сих пор путает, как логика относится к рваному методу массива 2D, любое уточнение будет оценен по достоинству! Кроме того, я не верю, что могу импортировать что угодно (по крайней мере, не предполагается), и еще раз это всего лишь вопрос обзора, поэтому я не подчеркиваю получение ответа, просто пытаясь понять логику, лежащую в его основе.

+0

Так в чем проблема? Если вы удалите нули, вам не нужно ничего подсчитывать, пока вы используете ArrayList, а не массив. Если вы используете массив, обработайте все строки и найдите наибольшее количество ненулевых значений. –

+0

Взгляните на это: http://stackoverflow.com/q/4150233/1743880 – Tunaki

ответ

2

Вы можете попробовать это так:

public static void main(String[] args) { 
    String[][] ragged = { { "John", null, "Mary", "George", null }, { null, "Pete", "Rick" }, { null, null, null } }; 

    String[][] cleaned = new String[ragged.length][]; 
    for (int i = 0; i < ragged.length; i++) { 
     cleaned[i] = clean(ragged[i]); // Apply clean method to each sub array. 
    } 

    System.out.println(Arrays.deepToString(cleaned)); 
} 

private static String[] clean(String[] dirty) { 
    int nonNullCount = 0; 
    for (String string : dirty) { 
     if (string != null) { 
      nonNullCount++; // Count non-null Strings. 
     } 
    } 
    String[] clean = new String[nonNullCount]; // Create array for non-null Strings. 
    int cleanIndex = 0; 
    for (String string : dirty) { 
     if (string != null) { 
      clean[cleanIndex] = string; // Insert only non-null String at index. 
      cleanIndex++; // Only then update index. 
     } 
    } 
    return clean; 
} 

Кажется немного безвкусный для меня, но в данный момент я не могу думать, чтобы предотвратить двойную петлю в clean(String[] dirty)

Тем не менее , он выдает [[John, Mary, George], [Pete, Rick], []] по желанию.

Редактировать: Обновлен несколько комментариев.