Ao invés de fazer a soma direto dentro do seu for
, vc deveria armazenar os dados num ArrayList para processá-los depois.
Ficaria mais fácil se vc criasse uma classe para representar cada linha do seu arquivo. Algo como:
class Estado {
final String estado;
final int infectados;
final int falecidos;
final int curados;
}
Eu fiz um exemplo completo:
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;
public class App3 {
static class Estado {
final String estado;
final int infectados;
final int falecidos;
final int curados;
Estado(final String estado, final int infectados, final int falecidos, final int curados) {
this.estado = estado;
this.infectados = infectados;
this.falecidos = falecidos;
this.curados = curados;
}
@Override
public String toString() {
final String fmt = "Estado[estado=%s, infectados=%d, falecidos=%d, curados=%d]";
return String.format(fmt, this.estado, this.infectados, this.falecidos, this.curados);
}
}
public static void main(String... args) {
final Locale locale = Locale.forLanguageTag("pt-BR");
final Path path = Paths.get("C:", "brasil.txt");
try (final Scanner scan = new Scanner(path).useLocale(locale).useDelimiter("[,\n]")) {
final List<Estado> estados = new ArrayList<>();
while (scan.hasNext()) {
estados.add(new Estado(scan.next(), scan.nextInt(), scan.nextInt(), scan.nextInt()));
}
// A partir daqui vc faz o que quiser com estados.
estados.forEach(estado -> System.out.println(estado));
} catch (final IOException e) {
e.printStackTrace();
}
}
}
E se vc usar as streams do Java 8, poderia ficar mais elegante, veja:
public static void main(String... args) throws IOException {
final List<Estado> estados = Files.lines(Paths.get("C:", "brasil.txt")).map(line -> {
try (final Scanner scan = new Scanner(line).useLocale(Locale.forLanguageTag("pt-BR")).useDelimiter(",")) {
return new Estado(scan.next(), scan.nextInt(), scan.nextInt(), scan.nextInt());
}
}).collect(Collectors.toList());
// A partir daqui vc faz o que quiser com estados como ordenar por curados.
estados.sort((a, b) -> Integer.compare(b.curados, a.curados));
System.out.println(estados.get(0));
}
E vc poderia ir mais longe e criar seu proprio Collector para reunir os dados que vc precisa, veja:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Locale;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.stream.Collector;
public class App2 {
static class Estado {
final String estado;
final int infectados;
final int falecidos;
final int curados;
Estado(final String estado, final int infectados, final int falecidos, final int curados) {
this.estado = estado;
this.infectados = infectados;
this.falecidos = falecidos;
this.curados = curados;
}
@Override
public String toString() {
final String fmt = "Estado[estado=%s, infectados=%d, falecidos=%d, curados=%d]";
return String.format(fmt, this.estado, this.infectados, this.falecidos, this.curados);
}
}
static class ResumoPorEstado implements Consumer<Estado> {
private static final Estado MAX = new Estado("--", Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
private static final Estado MIN = new Estado("--", Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
private Estado maxInfectados = MAX;
private Estado maxCurados = MAX;
private Estado maxFalecidos = MAX;
private Estado minInfectados = MIN;
private Estado minCurados = MIN;
private Estado minFalecidos = MIN;
private int totalInfectados;
private int totalCurados;
private int totalFalecidos;
private int quantidade;
@Override
public void accept(Estado t) {
++this.quantidade;
this.totalInfectados += t.infectados;
this.totalCurados += t.curados;
this.totalFalecidos += t.falecidos;
if (this.maxCurados.curados < t.curados)
this.maxCurados = t;
if (this.maxFalecidos.falecidos < t.falecidos)
this.maxFalecidos = t;
if (this.maxInfectados.infectados < t.infectados)
this.maxInfectados = t;
if (this.minCurados.curados > t.curados)
this.minCurados = t;
if (this.minFalecidos.falecidos > t.falecidos)
this.minFalecidos = t;
if (this.minInfectados.infectados > t.infectados)
this.minInfectados = t;
}
public ResumoPorEstado combine(final ResumoPorEstado other) {
this.quantidade += other.quantidade;
this.totalInfectados += other.totalInfectados;
this.totalCurados += other.totalCurados;
this.totalFalecidos += other.totalFalecidos;
if (this.maxCurados.curados < other.maxCurados.curados)
this.maxCurados = other.maxCurados;
if (this.maxFalecidos.falecidos < other.maxFalecidos.falecidos)
this.maxFalecidos = other.maxFalecidos;
if (this.maxInfectados.infectados < other.maxInfectados.infectados)
this.maxInfectados = other.maxInfectados;
if (this.minCurados.curados > other.minCurados.curados)
this.minCurados = other.minCurados;
if (this.minFalecidos.falecidos > other.minFalecidos.falecidos)
this.minFalecidos = other.minFalecidos;
if (this.minInfectados.infectados > other.minInfectados.infectados)
this.minInfectados = other.minInfectados;
return this;
}
@Override
public String toString() {
final String curados = String.format("Estado com maior/menor número de curados : %s (%5d) / %s (%5d)\n",
maxCurados.estado, maxCurados.curados, minCurados.estado, minCurados.curados);
final String infectados = String.format("Estado com maior/menor número de infectados: %s (%5d) / %s (%5d)\n",
maxInfectados.estado, maxInfectados.infectados, minInfectados.estado, minInfectados.infectados);
final String falecidos = String.format("Estado com maior/menor número de falecidos : %s (%5d) / %s (%5d)\n",
maxFalecidos.estado, maxFalecidos.falecidos, minFalecidos.estado, minFalecidos.falecidos);
final String total = String.format("\nTotais:\n\tCurados : %7d\n\tInfectados: %7d\n\tFalecidos : %7d\n",
totalCurados, totalInfectados, totalFalecidos);
final String media = String.format(
"\nMédias:\n\tCurados : %10.3f\n\tInfectados: %10.3f\n\tFalecidos : %10.3f\n",
(float) totalCurados / quantidade, (float) totalInfectados / quantidade, (float) totalFalecidos / quantidade);
return curados + infectados + falecidos + total + media;
}
public static Collector<Estado, ?, ResumoPorEstado> newCollector() {
return Collector.of(ResumoPorEstado::new, ResumoPorEstado::accept, ResumoPorEstado::combine);
}
}
public static void main(String... args) throws IOException {
final ResumoPorEstado resumo = Files.lines(Paths.get("C:", "brasil.txt")).map(line -> {
try (final Scanner scan = new Scanner(line).useLocale(Locale.forLanguageTag("pt-BR")).useDelimiter(",")) {
return new Estado(scan.next(), scan.nextInt(), scan.nextInt(), scan.nextInt());
}
}).collect(ResumoPorEstado.newCollector());
System.out.println(resumo);
}
}