0Pricing
Java Academy · Aula

Utilitários 2D como classe auxiliar (refatoração)

Refatore a lógica 2D repetida em uma classe auxiliar reutilizável. Exponha utilitários estáticos para larguras, impressão alinhada, médias, máximos e transposição. Use a classe auxiliar em pequenas demonstrações.

Utilitários 2D como classe auxiliar (refatoração) é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 5 de 6. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 6 aulas no total.

Por que refatorar

Por que refatorar em uma classe auxiliar? Evite copiar e colar, mantenha uma única fonte de verdade e torne as lições seguintes mais simples. Criaremos uma classe auxiliar GradeUtil com métodos estáticos para larguras, impressão alinhada, médias, máximos e transposição.

Esqueleto da classe auxiliar + impressão

Crie uma classe auxiliar GradeUtil com os métodos estáticos de larguras e printAligned. Depois, a partir de main, chame GradeUtil.printAligned(m) para imprimir qualquer matriz irregular com colunas alinhadas.

public class Main {
  // Static helper with reusable utilities for 2D int matrices
  static class GradeUtil {
    // Compute per-column widths (jagged-aware)
    static int[] widths(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] w = new int[maxCols];
      for (int r = 0; r < m.length; r = r + 1) {
        for (int c = 0; c < m[r].length; c = c + 1) {
          int len = Integer.toString(m[r][c]).length();
          if (len > w[c]) w[c] = len;
        }
      }
      for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
      return w;
    }

    // Print matrix with aligned columns
    static void printAligned(int[][] m) {
      int[] w = widths(m);
      for (int r = 0; r < m.length; r = r + 1) {
        String line = "";
        for (int c = 0; c < m[r].length; c = c + 1) {
          String s = Integer.toString(m[r][c]);
          while (s.length() < w[c]) s = " " + s;
          line = line + s + (c + 1 < m[r].length ? " " : "");
        }
        System.out.println(line);
      }
    }
  }

  public static void main(String[] args) {
    // Demo: build a small jagged matrix and print it via the helper
    int[][] m = {
      {1, 23, 456},
      {7, 8},
      {90, 12, 3, 4}
    };
    System.out.println("Aligned print via GradeUtil:");
    GradeUtil.printAligned(m);
  }
}

Função auxiliar para médias

Adicione rowAverage e colAverage à classe auxiliar e chame-os a partir de main. As médias das colunas devem verificar o comprimento de cada linha para garantir segurança em matrizes irregulares.

public class Main {
  static class GradeUtil {
    static double rowAverage(int[][] g, int r) {
      int sum = 0;
      for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
      return (double) sum / g[r].length;
    }
    static double colAverage(int[][] g, int c) {
      int sum = 0;
      int count = 0;
      for (int r = 0; r < g.length; r = r + 1) {
        if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; }
      }
      return (double) sum / count;
    }
  }

  public static void main(String[] args) {
    int[][] g = {
      {78, 85, 90, 88, 92},
      {95, 91, 89, 93, 87},
      {60, 72, 70, 68, 75},
      {88, 84, 79, 85, 90}
    };

    // Use helper to compute row averages
    for (int r = 0; r < g.length; r = r + 1) {
      double avg = GradeUtil.rowAverage(g, r);
      System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
    }

    // Use helper to compute column averages
    for (int c = 0; c < g[0].length; c = c + 1) {
      double avg = GradeUtil.colAverage(g, c);
      System.out.println("assignment " + c + " avg = " + String.format("%.2f", avg));
    }
  }
}

Funções auxiliares de transposição

Implemente a transposição para matrizes retangulares e irregulares. A versão irregular cria linhas para cada índice de coluna e preenche com zero as entradas ausentes.

public class Main {
  static class GradeUtil {
    // Transpose rectangular matrix (R x C) -> (C x R)
    static int[][] transposeRect(int[][] m) {
      int rows = m.length;
      int cols = m[0].length;
      int[][] t = new int[cols][rows];
      for (int r = 0; r < rows; r = r + 1) {
        for (int c = 0; c < cols; c = c + 1) t[c][r] = m[r][c];
      }
      return t;
    }
    // Jagged-safe transpose (pads with 0)
    static int[][] transposeJagged(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[][] t = new int[maxCols][];
      for (int c = 0; c < maxCols; c = c + 1) {
        t[c] = new int[m.length];
        for (int r = 0; r < m.length; r = r + 1) t[c][r] = (c < m[r].length) ? m[r][c] : 0;
      }
      return t;
    }
  }

  public static void main(String[] args) {
    int[][] rect = {
      {1, 2, 3},
      {4, 5, 6}
    };
    int[][] t = GradeUtil.transposeRect(rect);
    System.out.println("t[0][1] should be 2: " + t[0][1]);

    int[][] jag = {
      {9, 12, 7},
      {5},
      {8, 10}
    };
    int[][] tj = GradeUtil.transposeJagged(jag);
    System.out.println("tj[1][0] should be 12: " + tj[1][0]);
  }
}

Função auxiliar para máximos por coluna

Disponibilize colMaxima para calcular o máximo de cada coluna, tratando linhas irregulares com segurança. Use um sinalizador de presença para evitar mínimos incorretos quando uma coluna estiver vazia.

public class Main {
  static class GradeUtil {
    // Column maxima for a jagged matrix
    static int[] colMaxima(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] max = new int[maxCols];
      for (int c = 0; c < maxCols; c = c + 1) {
        int best = Integer.MIN_VALUE;
        boolean seen = false;
        for (int r = 0; r < m.length; r = r + 1) {
          if (c < m[r].length) {
            if (!seen || m[r][c] > best) { best = m[r][c]; seen = true; }
          }
        }
        max[c] = seen ? best : 0;
      }
      return max;
    }
  }

  public static void main(String[] args) {
    int[][] jag = {
      {9, 12, 7},
      {5},
      {8, 10}
    };
    int[] cm = GradeUtil.colMaxima(jag);
    System.out.print("col maxima: ");
    for (int i = 0; i < cm.length; i = i + 1) System.out.print(cm[i] + (i + 1 < cm.length ? " " : ""));
    System.out.println();
  }
}

Todos os utilitários juntos

Reúna os utilitários em uma única classe auxiliar e execute-os a partir de um único main: impressão, médias, transposição e máximos por coluna. Este é o seu conjunto de ferramentas reutilizável para as próximas lições.

public class Main {
  static class GradeUtil {
    static int[] widths(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] w = new int[maxCols];
      for (int r = 0; r < m.length; r = r + 1) {
        for (int c = 0; c < m[r].length; c = c + 1) {
          int len = Integer.toString(m[r][c]).length();
          if (len > w[c]) w[c] = len;
        }
      }
      for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
      return w;
    }
    static void printAligned(int[][] m) {
      int[] w = widths(m);
      for (int r = 0; r < m.length; r = r + 1) {
        String line = "";
        for (int c = 0; c < m[r].length; c = c + 1) {
          String s = Integer.toString(m[r][c]);
          while (s.length() < w[c]) s = " " + s;
          line = line + s + (c + 1 < m[r].length ? " " : "");
        }
        System.out.println(line);
      }
    }
    static double rowAverage(int[][] g, int r) {
      int sum = 0; for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
      return (double) sum / g[r].length;
    }
    static double colAverage(int[][] g, int c) {
      int sum = 0; int count = 0;
      for (int r = 0; r < g.length; r = r + 1) { if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; } }
      return (double) sum / count;
    }
    static int[][] transposeRect(int[][] m) {
      int rows = m.length; int cols = m[0].length; int[][] t = new int[cols][rows];
      for (int r = 0; r < rows; r = r + 1) for (int c = 0; c < cols; c = c + 1) t[c][r] = m[r][c];
      return t;
    }
    static int[][] transposeJagged(int[][] m) {
      int maxCols = 0; for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[][] t = new int[maxCols][];
      for (int c = 0; c < maxCols; c = c + 1) { t[c] = new int[m.length]; for (int r = 0; r < m.length; r = r + 1) t[c][r] = (c < m[r].length) ? m[r][c] : 0; }
      return t;
    }
    static int[] colMaxima(int[][] m) {
      int maxCols = 0; for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] max = new int[maxCols];
      for (int c = 0; c < maxCols; c = c + 1) {
        int best = Integer.MIN_VALUE; boolean seen = false;
        for (int r = 0; r < m.length; r = r + 1) if (c < m[r].length) { if (!seen || m[r][c] > best) { best = m[r][c]; seen = true; } }
        max[c] = seen ? best : 0;
      }
      return max;
    }
  }

  public static void main(String[] args) {
    int[][] g = {
      {78, 85, 90, 88, 92},
      {95, 91, 89, 93, 87},
      {60, 72, 70, 68, 75},
      {88, 84, 79, 85, 90}
    };

    System.out.println("Original gradebook:");
    GradeUtil.printAligned(g);

    System.out.println("Row averages:");
    for (int r = 0; r < g.length; r = r + 1) System.out.println(r + ": " + String.format("%.2f", GradeUtil.rowAverage(g, r)));

    System.out.println("Column averages:");
    for (int c = 0; c < g[0].length; c = c + 1) System.out.println(c + ": " + String.format("%.2f", GradeUtil.colAverage(g, c)));

    System.out.println("Transpose (rect):");
    GradeUtil.printAligned(GradeUtil.transposeRect(g));

    System.out.println("Column maxima:");
    int[] cm = GradeUtil.colMaxima(g);
    for (int i = 0; i < cm.length; i = i + 1) System.out.print(cm[i] + (i + 1 < cm.length ? " " : ""));
    System.out.println();
  }
}

Verificação de chamada estática

Verificação rápida: Como você chama uma função auxiliar estática que imprime uma matriz?

Recapitulação e próxima etapa

Recapitulação: Você refatorou operações 2D comuns em uma classe auxiliar GradeUtil e a utilizou em várias demonstrações. Isso mantém o código pequeno, legível e consistente entre as lições.

Perguntas Frequentes

A aula “Utilitários 2D como classe auxiliar (refatoração)” é grátis?

Sim — o texto completo de “Utilitários 2D como classe auxiliar (refatoração)” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 6 aulas no total.

O que vou aprender em “Utilitários 2D como classe auxiliar (refatoração)”?

Refatore a lógica 2D repetida em uma classe auxiliar reutilizável. Exponha utilitários estáticos para larguras, impressão alinhada, médias, máximos e transposição. Use a classe auxiliar em pequenas d… Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 5 de 6.

Quanto tempo leva a aula “Utilitários 2D como classe auxiliar (refatoração)”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Noções básicas de matrizes 2D e iteração aninhada
  2. Matrizes irregulares e formatação de tabelas
  3. Máximos por linha/coluna, transposição e formatação
  4. Mini-projeto 2D: boletim de notas
  5. Utilitários 2D como classe auxiliar (refatoração)
  6. Limpeza e validação de dados 2D
← Voltar para Java Academy