2016-05-10 3 views
1

Я занимаюсь школьным проектом, и мне нужно распечатать массив по количеству потраченных (по убыванию). Проблема в том, что я получил нули внутри, объединив 5 массивов в один и собрав информацию внутри цикла for, поэтому мне пришлось объявить массив в верхней части моего кода.Печать 2d Строковый массив по столбцу

Так что мой код что-то вроде этого:

       ⇩ 

        Entry | Amount | Category  | Payment | Date 

String array[][]={ {"5", "22,2", "car payment", "visa", "21/04/2016"}, 
        {"1", "44,4", "shop", "cash", "16/02/2017"}, 
        {"2", "33,1", "shop", "cash", "15/01/2020"}, 
        {"3", "17,3", "gym", "visa", "10/01/2016"}, 
        {null, null, null, null, null}, 
        {null, null, null, null, null}, 
        {null, null, null, null, null}, 
        {null, null, null, null, null}, }; 

Так что я попытался с помощью Arrays.sort() с помощью Comparator, но я не могу показаться, чтобы получить это право, так как я получил эти аннулирует внутри я всегда получаю java.lang.NullPointerException.

То, что я попытался это:

Arrays.sort(array, (String[] o1, String[] o2) -> Float.compare(Float.parseFloat(o2[1]), 
         Float.parseFloat(o1[1]))); 

И то, что я пытаюсь получить это:

   {"1", "44,4", "shop", "cash", "16/02/2017"}, 
       {"2", "33,1", "shop", "cash", "15/01/2020"}, 
       {"5", "22,2", "car payment", "visa", "21/04/2016"}, 
       {"3", "17,3", "gym", "visa", "10/01/2016"}}; 

Любая помощь будет оценена так. Спасибо!

+1

Держу пари, проблема в вашем коде компаратора. Если, например, вы сортируете массив в 'Entry', тогда вы всегда можете выбрать элемент« null », который должен появиться после ненулевого. –

+0

Извините, что не поняли. Я только что редактировал вопрос. –

+0

Кроме того, вы всегда можете _filter_ массивы строк, которые считаются недействительными. Таким образом, у вас есть ненулевые значения для полей, которые вам интересны (при сортировке). –

ответ

1

Я считаю, что следующий код работает достаточно хорошо:

public class StringArraySorter { 
    public static void main(String[] args) { 
     String array[][]={ {"5", "22,2", "car payment", "visa", "21/04/2016"}, 
       {"1", "44,4", "shop", "cash", "16/02/2017"}, 
       {"2", "33,1", "shop", "cash", "15/01/2020"}, 
       {"3", "17,3", "gym", "visa", "10/01/2016"}, 
       {null, null, null, null, null}, 
       {null, null, null, null, null}, 
       {null, null, null, null, null}, 
       {null, null, null, null, null}, 
     }; 

     Arrays.sort(array, new Comparator<String[]>() { 
      @Override 
      public int compare(String[] o1, String[] o2) { 
       String a1 = o1[1]; // amount field 
       String a2 = o2[1]; // amount field 
       if (a1 != null && a2 != null) { 
        a1 = a1.replace(',', '.'); 
        a2 = a2.replace(',', '.'); 
        return Float.compare(Float.parseFloat(a2), Float.parseFloat(a1)); 
       } 
       return 1; // non-null value for amount takes precedence, whatever that may be 
      } 
     }); 
     System.out.println(Arrays.deepToString(array)); 
    } 
} 

Он печатает (модифицировано для вставки новой строки), который находится рядом с вашими требованиями:

[[1, 44,4, shop, cash, 16/02/2017], 
[2, 33,1, shop, cash, 15/01/2020], 
[5, 22,2, car payment, visa, 21/04/2016], 
[3, 17,3, gym, visa, 10/01/2016], 
[null, null, null, null, null], 
[null, null, null, null, null], 
[null, null, null, null, null], 
[null, null, null, null, null]] 

Теперь вы можете всегда чернослива ваш массив ввода для удаления записей (строковых массивов), которые имеют определенные ключевые поля null (или недействительными каким-либо другим способом), перед отправкой массива в метод Arrays.sort. Первоначальная попытка на него с помощью Java 8 конструкций (но, возможно, немного загадочная) будет:

Arrays.stream(array).filter(a -> a[2] != null) 
      .sorted((o1, o2) -> Float.compare(Float.parseFloat(o1[1].replace(',', '.')), Float.parseFloat(o1[1].replace(',', '.')))) 
      .forEach(a -> System.out.println("{" + Arrays.stream(a).map(s -> "\"" + s + "\"").collect(Collectors.joining(", ")) + 
      "}")); 

, который печатает:

{"1", "44,4", "shop", "cash", "16/02/2017"} 
{"2", "33,1", "shop", "cash", "15/01/2020"} 
{"5", "22,2", "car payment", "visa", "21/04/2016"} 
{"3", "17,3", "gym", "visa", "10/01/2016"} 
+0

Он работает smooooooth! Но как я могу напечатать его в таком формате? Могу ли я использовать printf или использовать для каждого? –

+0

Ну, в вашем коде вы не проверяете 'null'! –

+0

Да, для печати так, как вы этого хотите, возможно, вы можете проходить через массив и использовать свой собственный _stringifier_. –

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