Javaの課題で教えていただきたいです。
<修正事項>
・「select no lesson term from kenshu where no="1" and lesson="English"」とコン ソールに入力するとエラーが起こる
・複数のカラムが指定された際でも、NOの列しか表示されない
下記のコードで、二つの修正事項が全く分かりません。。。
どなたか教えていただきたいです。。。
package HelloWorld5;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Q75syusei {
public static Map<String, Map<Integer, String>> makeTable() {
int no = 3;
Map<String, Map<Integer, String>> map = new HashMap<String, Map<Integer, String>>(); Map<Integer, String> NO = new HashMap<Integer, String>(); for (int i = 0; i < no; i++) { NO.put(i, Integer.toString(i)); } Map<Integer, String> LESSON = new HashMap<Integer, String>(); LESSON.put(0, "English"); LESSON.put(1, "math"); LESSON.put(2, "Music"); Map<Integer, String> TERM = new HashMap<Integer, String>(); TERM.put(0, "A"); TERM.put(1, "B"); TERM.put(2, "A"); Map<Integer, String> RESULT = new HashMap<Integer, String>(); RESULT.put(0, "90"); RESULT.put(1, "50"); RESULT.put(2, "120"); map.put("NO", NO); map.put("LESSON", LESSON); map.put("TERM", TERM); map.put("RESULT", RESULT); return map; } public static void getSQL(List<String> checkSQL, boolean boo) { Map<String, Map<Integer, String>> tableMap = makeTable(); int selectStartNum = checkSQL.indexOf("SELECT") + 1; int fromStartNum = checkSQL.indexOf("FROM") + 1; int whereStartNum = checkSQL.indexOf("WHERE") + 1; String[] selectstr = checkSQL.get(1).split(","); if (boo) { ArrayList<String> getSQLList = new ArrayList<String>(); System.out.println(checkSQL); int count = whereStartNum; List<Integer> displayNnums = new ArrayList<Integer>(); displayNnums.add(0); displayNnums.add(1); displayNnums.add(2); while (true) { String[] whereTmpStrings = checkSQL.get(count).split("="); List<Integer> delete = new ArrayList<Integer>(); whereTmpStrings[1] = whereTmpStrings[1].substring(1, whereTmpStrings[1].length() - 1); for (int i = 0; i < displayNnums.size(); i++) { if (!tableMap.get(whereTmpStrings[0]).get(i).equals(whereTmpStrings[1])) { System.out.println(tableMap.get(whereTmpStrings[0]).get(i) + whereTmpStrings[1]); delete.add(i); } } for (Integer integer : delete) { displayNnums.remove(displayNnums.indexOf(integer)); } try { checkSQL.get(count + 1); } catch (Exception e) { break; } count += 2; } for (int i = 0; i < selectstr.length; i++) { System.out.printf("%10s", selectstr[i]); } System.out.println(); for (int i : displayNnums) { for (String string : selectstr) { System.out.printf("%10s", tableMap.get(string).get(i) + " "); } System.out.println(); } } else { for (int i = 0; i < selectstr.length; i++) { System.out.printf("%10s", selectstr[i]); } System.out.println(); System.out.println("--------------------------"); for (int i = 0; i < tableMap.get("NO").size(); i++) { for (String string : selectstr) { System.out.printf("%10s", tableMap.get(string).get(i) + " "); } System.out.println(); } } } public static String BB(String string) { return string.toUpperCase(); } public static boolean karam(String string) { List<String> karamList = new ArrayList<String>(Arrays.asList("NO", "LESSON", "TERM", "RESULT")); return karamList.contains(string); } public static void selsectCheck(List<String> checkSQL) { int selectNum = checkSQL.indexOf("FROM"); boolean booe = false; String[] tmpStrings = checkSQL.get(1).split(","); if (!checkSQL.get(0).equals("SELECT")) { System.out.println("SELECT句が正しくありません。"); System.exit(0); } else if (checkSQL.get(1).equals("FROM")) { booe = true; } else { for (String string : tmpStrings) { booe = !karam(string); } } if (booe) { System.out.println("SELECT句の引数が正しくありません。"); System.exit(0); } } public static void fromCheck(List<String> checkSQL) { int fromStartNum = checkSQL.indexOf("FROM") + 1; if (!checkSQL.contains("FROM")) { System.out.println("FROM句が正しくありません。"); System.exit(0); } try { if (!checkSQL.get(fromStartNum).equals("KENSHU")) { System.out.println("FROM句の引数が正しくありません。"); System.exit(0); } } catch (Exception e) { System.out.println("FROM句が正しくありません。"); System.exit(0); } } public static void whereCheck(List<String> checkSQL) { int fromStartNum = checkSQL.indexOf("WHERE") + 1; boolean booe = false; int count = fromStartNum; String tmpFromSqlString = ""; for (int i = fromStartNum; i < checkSQL.size(); i++) { tmpFromSqlString += checkSQL.get(i); } String[] FromSqlString = tmpFromSqlString.split("AND"); int num = 0; while (true) { String[] whereTmpStrings = FromSqlString[num].split("="); if (!karam(whereTmpStrings[0])) { booe = true; } else if (whereTmpStrings.length != 2) { booe = true; } else { String[] tmpStrings = whereTmpStrings[1].split(""); if (!tmpStrings[0].equals("\"") || !tmpStrings[tmpStrings.length - 1].equals("\"")) { booe = true; } } if (booe) { System.out.println("WHERE句の引数が正しくありません。"); System.exit(0); } String tmp = ""; try { tmp = FromSqlString[num + 1]; } catch (Exception e) { break; } num++; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("SQLを入力してください。"); boolean whereboo = false; String scstr = sc.nextLine(); String[] sqlstr = scstr.split(" "); for (int i = 0; i < sqlstr.length; i++) { sqlstr[i] = BB(sqlstr[i]); } List<String> checkSQL = new ArrayList<String>(Arrays.asList(sqlstr)); checkSQL.remove(""); checkSQL.remove(" "); checkSQL.remove(","); selsectCheck(checkSQL); fromCheck(checkSQL); if (checkSQL.size() == checkSQL.indexOf("FROM") + 2) { } else { boolean boo = false; int fromEndNum = checkSQL.indexOf("FROM") + 1; if (!checkSQL.get(fromEndNum + 1).equals("WHERE")) { System.out.println("WHERE句が正しくありません。"); System.exit(0); } else { for (String str : checkSQL) { if (str.contains("=")) { whereCheck(checkSQL); boo = true; } whereboo = true; } if (boo == false) { System.out.println("WHERE句の引数が正しくありません。"); System.exit(0); } } } System.out.println("SQL は正しいです。"); getSQL(checkSQL, whereboo); }
}
ボールドテキスト
回答1件
あなたの回答
tips
プレビュー