사라지면서 반환하기 위해 rows = load(rows,count); rows에 담아준다.
package ex5.fnc;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class Program3MultiArray4 {
public static void main(String[] args) throws IOException {
int count = 0;
String[][] rows = null;
// ---------------------------------------------------------
// 레코드 개수를 알아내는 코드
count = getCount();
// --------------------------------------------------------
// rows = new String[count][];
// 레코드를 로드하는 코드
rows = load(rows, count); //rows:참조변수 / count:값변수
// ---------------------------------------------------------
// 레코드를 출력하는 코드
printCovid19List(rows, count);
// ---------------------------------------------------------
// 검사진행자 누적수를 얻는 코드
int total = getTotal(rows, count);// f3누르면 메소드로이동
System.out.println(total);
System.out.println();
// ---------------------------------------------------------
// 1.일별 가장 많은 검사진행수는? 몇입니꽈~
printMax(rows, count);
// 2.감사진행수가 가장 많았던 날짜는?
printB(rows, count);
// ---------------------------------------------------------
// 확진자 수가 늘어난 일자와 수를 출력하시오.
printA(rows, count);
// 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
String[][] results;
int resultCount = 0;
{
// 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
int old = 0; // 현재 확진자 수
for (int i = 0; i < count; i++) {
// i 번째 행의 확진자 수
int current = Integer.parseInt(rows[i][1]);
// i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
if (old != current) {
// 확진자 수가 달라지는 일자의 수를 증가
resultCount++;
old = current;
}
}
System.out.println(resultCount);
results = new String[resultCount][];
String date = "";
int diff = 0;
old = 0; // 현재 확진자 수
int index = 0;
for (int i = 0; i < count; i++) {
int current = Integer.parseInt(rows[i][1]);
if (old != current) {
diff = current - old;
date = rows[i][0];
// 코로나19 데이터 행을 저장하기 위한 배열
String[] row = new String[2];
row[0] = date; // date
row[1] = String.valueOf(diff); // diff
results[index++] = row;
old = current;
}
}
System.out.println("작업완료");
}
}//main메소드 끝
static void printCovid19List(String[][] rows, int count) {
System.out.println("// 레코드를 출력하는 코드------------------------");
for (int j = 0; j < count; j++) {
for (int i = 0; i < 10; i++) {
System.out.printf("%s", rows[j][i]);
if (i < 10 - 1)
System.out.printf(",");
}
System.out.println();
} // 큰for문끝
}// printCovid19List()끝
// --------------------------------------------------------
static int getTotal(String[][] rows, int count) {
int total = 0;
for (int i = 0; i < count; i++)
total += Integer.parseInt(rows[i][3]);
return total;
}
// ---------------------------------------------------------
// 크로스방향으로 단순히 나누기만 한 코드
// 좀 더 개선해 볼 수 있는 여지가 있는가 ?
// 함수의 4가지 특징 중에서 재사용을 생각해보면 ?
static int getMax(String[][] rows, int count) {
int max = 0;
int current;
for (int i = 0; i < count; i++) {
current = Integer.parseInt(rows[i][3]);
if (current > max)
max = current;
}
return max;
}
// ---------------------------------------------------------
static void printMax(String[][] rows, int count) {
int max = getMax(rows, count);// 메소드의 리턴값이 max에 담긴다.
System.out.printf("max: %d\n", max); // <-콘솔출력을 위한것, 데이터얻는것과 출력을 함께두면 전체적으로 콘솔출력용으로만써야된다.
System.out.println();
}
// ---------------------------------------------------------
// 확진자 수가 늘어난 일자와 수를 출력하시오.
static void printA(String[][] rows, int count) {
String date = "";
int diff = 0;
int old = 0; // 현재 확진자 수
int index = 0;
for (int i = 0; i < count; i++) {
int current = Integer.parseInt(rows[i][1]);
if (old != current) {
diff = current - old;
date = rows[i][0];
old = current;
System.out.printf("일자와 수%d : %s, %d\n", index++ + 1, date, diff);
}
}
}
// ---------------------------------------------------------
// 레코드를 로드하는 코드
static String[][] load(String[][] rows, int count) throws IOException {
rows = new String[count][];
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
String line;
fscan.nextLine();
for (int i = 0; i < count; i++) {
line = fscan.nextLine();
rows[i] = line.split(",");
}
fscan.close();
fis.close();
return rows;
}
// ---------------------------------------------------------
// 2.검사진행수가 가장 많았던 날짜는?
static String getDate(String[][] rows, int count) {
String date = "";
int idx = 0;
int max = getMax(rows, count);
for (int i = 0; i < count; i++)
if (max == Integer.parseInt(rows[i][3])) {
idx = i;
break;
}
date = rows[idx][0];
return date;
}
// ---------------------------------------------------------
// 2.검사진행수가 가장 많았던 날짜는? 출력
static void printB(String[][] rows, int count) {
String date = getDate(rows, count);
System.out.printf("%s", date);
System.out.println();
}
// ---------------------------------------------------------
static int getCount() throws IOException {
int count = 0;
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
// while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
while (fscan.hasNextLine()) {
fscan.nextLine();
count++;
}
fscan.close();
fis.close();
count--;//반환값필요
return count;
}
}//class끝
// 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
String[][] results;
int resultCount = 0;
{
// 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
int old = 0; // 현재 확진자 수
for(int i=0; i<count; i++) {
// i 번째 행의 확진자 수
int current = Integer.parseInt(rows[i][1]);
// i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
if(old != current) {
// 확진자 수가 달라지는 일자의 수를 증가
resultCount++;
old = current;
}
}
String[][] results;
전역화해서 나중에 사용할 수 있게한다.
if( old != current )
이전확진자수와 i번째확진자 수를 비교한다. 숫자가 다르면 카운트를 더한다.
후에 old = current; i번째 숫자를 이전확진자 수에 대입한다.
2. 증가한 횟수를 이용해 새로운 2차배열 생성,
[확진자 증가한 날짜, 증가수] 를 1차원 배열row[]에 넣기.
각 1차원배열을 2차원배열results[][]에 대입
results = new String[resultCount][];
//이름표: 4바이트, 주소는 4바이트=32비트
String date = "";
int diff = 0;
old = 0; // 위에서 쓰였으므로 초기화시키기
int index = 0;
for(int i=0; i<count; i++) { //데이터 총 행인 76까지반복
int current = Integer.parseInt(rows[i][1]); //제주 확진자
if(old != current) {//기존확진자와 현재확진자비교
diff = current - old;//차이 = 현재확진자-기존확진자
date = rows[i][0]; //차이발생한 날
old = current; //기존확진자->현재확진자
String[] row = new String[2];
row[0] = date; // date
row[1] = String.valueOf(diff); // 정수->문자열변환
results[index] = row; //index++후 출력하면 인덱스1이 증가되어 다음인덱스가출력됨
System.out.println(Arrays.toString(results[index]));
index++;//results배열인덱스 증가
}
}
System.out.println("작업완료");
int index = 0;
변수를 쓰는곳 가까이에 선언한다.
String[] row = new String[2];
row[0] = date;
row[1] = String.valueof(diff);
if문의 조건이 성립되어 date, diff가 계산이 되고, 계산된 date와 diff를 1차원배열 row[]에 담아준다.
results[index++] = row;
1차원배열row[]를 2차원배열results[index]에 연결시킨다.
results[i]를 하게되면 ArrayIndexOutOfBoundsException발생한다. 이유는 i가 for문범위인 count(76)까지 돌게된다.
results[resultsCount][];로 선언했고 resultsCount는 20이므로 범위를 초과하게된다.
i과 상관없이 새로운 변수 index를 선언하고 반복문이 실행되는 동안 증가할수있게 index++를 한다.
자바의 2차원배열은 1차원배열이 여러개가 연결된것.
// 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
String[][] results;
int resultCount = 0;
{
// 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
int old = 0; // 현재 확진자 수
for(int i=0; i<count; i++) {
// i 번째 행의 확진자 수
int current = Integer.parseInt(rows[i][1]);
// i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
if(old != current) {
// 확진자 수가 달라지는 일자의 수를 증가
resultCount++;
old = current;
}
}
System.out.println(resultCount);
results = new String[resultCount][];
//이름표: 4바이트, 주소는 4바이트=32비트
String date = "";
int diff = 0;
old = 0; // 위에서 쓰였으므로 초기화시키기
int index = 0;
for(int i=0; i<count; i++) { //데이터 총 행인 76까지반복
int current = Integer.parseInt(rows[i][1]); //제주 확진자
if(old != current) {//기존확진자와 현재확진자비교
diff = current - old;//차이 = 현재확진자-기존확진자
date = rows[i][0]; //차이발생한 날
old = current; //기존확진자->현재확진자
String[] row = new String[2];
row[0] = date; // date
row[1] = String.valueOf(diff); // 정수->문자열변환
results[index] = row; //index++후 출력하면 인덱스1이 증가되어 다음인덱스가출력됨
System.out.println(Arrays.toString(results[index]));
index++;//results배열인덱스 증가
}
}
System.out.println("작업완료");
}
//일별 가장 많은 검사진행 수는 ?
{
int max = 0;
int current;
for(int i =0; i<count;i++) {
current = Integer.parseInt(rows[i][3]);
if(current > max)
max = current;
}
System.out.println(max);
System.out.println();
}
2. 검사 진행 수가 가장 많았던 날짜는 ?
해당되는 열의 위치를 찾아 동일한 행,다른열에서 데이터찾기.
//검사진행수가 가장 많았던 날짜는 ?
String date ="";
int idx = 0;
for(int i=0;i<count;i++) {
if(rows[i][3].equals(String.valueOf(max))) //세미콜론주의
idx = i;
}
date = rows[idx][0];
System.out.println(date);
3. 확진자 수가 늘어난 일자와 수를 출력하시오.
데이터값 변화가있는 열의 위치찾기→데이터변화차이구하기→ 동일한 행,다른열의 데이터찾기(날짜).
//확진자 수가 늘어난 일자와 수를 출력하시오.
{
String date="";
int diff = 0;
int current = Integer.parseInt(rows[0][1]);
int index = 0;
int next = 0;
for(int i=0;i<count;i++) {
next = Integer.parseInt(rows[i][1]); //변화할위치
if(current!=next) {
diff = next - current;
date = rows[i][0];
current = next;
index++;
System.out.printf("%d : %s, %d\n",index,date,diff);
}
}
package ex3.array;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
public class Program3MultiArray3 {
public static void main(String[] args) throws IOException {
int count = 0;
String[][] rows;
//--------------------------------------------------------------
//레코드 개수를 알아 내는 코드
{
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
//while반복을 하면서 count++연산을 한다. 마지막 줄을 만날때까지
String line;
while(scan.hasNextLine()) {
line = scan.nextLine();
count++;
}
scan.close();
fis.close();
count--;
System.out.println("총 행의 갯수"+count);
}//충돌방지
//--------------------------------------------------------------
//레코드를 로드하는 코드
{
rows = new String[count][];
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
/*
* 0번째방 : {"a", "b", "c"}
* 1번째방 : {"d", "e", "f"}
*
* */
String line;
scan.nextLine(); // 담을필요없다.한줄버리기
for (int i = 0; i < count; i++) { // 한줄 불러오고, 나눠서 배열에넣기
line = scan.nextLine(); // 한줄불러오기
rows[i] = line.split(","); // 불러온것 쉼표로 구분
}
scan.close();
fis.close();
}
//--------------------------------------------------------------
//레코드 출력하는 코드
for (int j = 0; j < count; j++) { // 행
for (int i = 0; i < 10; i++) { // 열채우기
System.out.printf("%s", rows[j][i]);
if (i < 9)
System.out.printf(",");
}
System.out.println();
}
//--------------------------------------------------------------
//검사진행자 누적수 얻는 코드
{
int total = 0;
for(int i=0;i<count;i++)
total += Integer.parseInt(rows[i][3]); //문자열을 정수로 형변환
System.out.println(total);
}
//--------------------------------------------------------------
//일별 가장 많은 검사진행 수는 ?
{
int max = 0;
int current;
for(int i =0; i<count;i++) {
current = Integer.parseInt(rows[i][3]);
if(current > max)
max = current;
}
System.out.println(max);
System.out.println();
//검사진행수가 가장 많았던 날짜는 ?
String date ="";
int idx = 0;
for(int i=0;i<count;i++) {
if(rows[i][3].equals(String.valueOf(max))) //세미콜론주의
idx = i;
}
date = rows[idx][0];
System.out.println(date);
}
//확진자 수가 늘어난 일자와 수를 출력하시오.
{
String date = "";
int diff = 0;
int old = 0; //이전확진자수
int current = 0; //현재확진자 수
int index = 0;
for(int i=1;i<count;i++) {
current = Integer.parseInt(rows[i][1]);
if(old != current) {
diff = current - old;
date = rows[i][0];
old = current;
//년 월 일로 출력하기
date = date.substring(0,4)+"년"+
date.substring(5,7)+"월"+
date.substring(8,10)+"일";
System.out.printf("%d : %s, %d\n",index+++1,date,diff);
}
}
}
}
}
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
//while반복을 하면서 count++연산을 한다. 마지막 줄을 만날때까지
String line;
while(scan.hasNextLine()) {
line = scan.nextLine();
count ++;
}
scan.close();
fis.close();
count--;
System.out.println("총 행의 갯수"+count);
3.레코드 로드(데이터불러와서 쉼표로 구분하고 배열에 넣기)
rows = new String[count][];
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
String line;
scan.nextLine(); // 담을필요없다.한줄버리기
for (int i = 0; i < count; i++) { // 한줄 불러오고, 나눠서 배열에넣기
line = scan.nextLine(); // 한줄불러오기
rows[i] = line.split(","); // 불러온것 쉼표로 구분
}
scan.close();
fis.close();
4.레코드출력해서 확인
for (int j = 0; j < count; j++) { // 행
for (int i = 0; i < 10; i++) { // 열채우기
System.out.printf("%s", rows[j][i]);
if (i < count-1)
System.out.printf(",");
}
System.out.println();
}
5.검사진행자 누적수 얻는 코드작성
int total = 0;
for(int i=0;i<count;i++)
total += Integer.parseInt(rows[i][3]);
System.out.println(total);
package ex3.array;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class Program3MultiArray3 {
public static void main(String[] args) throws IOException {
int count = 0;
String[][] rows; // 배열의 배열 [2][10] 10개짜리2개 [행][열]
//--------------------------------------------------------------
//레코드 개수를 알아 내는 코드
{
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
//while반복을 하면서 count++연산을 한다. 마지막 줄을 만날때까지
String line;
while(scan.hasNextLine()) {
line = scan.nextLine();
count ++;
}
scan.close();
fis.close();
count--;
System.out.println("총 행의 갯수"+count);
}//충돌방지
//--------------------------------------------------------------
//레코드를 로드하는 로드
{
rows = new String[count][];
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
String line;
scan.nextLine(); // 담을필요없다.한줄버리기
for (int i = 0; i < count; i++) { // 한줄 불러오고, 나눠서 배열에넣기
line = scan.nextLine(); // 한줄불러오기
rows[i] = line.split(","); // 불러온것 쉼표로 구분
}
scan.close();
fis.close();
}
//--------------------------------------------------------------
//레코드 출력하는 코드
for (int j = 0; j < count; j++) { // 행
for (int i = 0; i < 10; i++) { // 열채우기
System.out.printf("%s", rows[j][i]);
if (i < count-1)
System.out.printf(",");
}
System.out.println();
}
//--------------------------------------------------------------
//검사진행자 누적수 얻는 코드
{
int total = 0;
for(int i=0;i<count;i++)
total += Integer.parseInt(rows[i][3]);
System.out.println(total);
}
}
}