java - 在不使用聚合函数的情况下删除 sql 中的重复项
问题描述
我开始学习java,但我的练习有问题。
这是整个代码的片段:
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.util.ArrayList;
import java.sql.PreparedStatement;
private static final int MAX_LINES = 44;
private static final int REPORT_COL1 = 30;
private static final int REPORT_COL = 15;
private ArrayList<String> errors = new ArrayList<String>();
private ArrayList<String> detailReport = new ArrayList<String>();
private ArrayList<String> summaryReport= new ArrayList<String>();
String firstSortCode= (String) parameters.get("01");
if(firstSortCode==null || firstSortCode.trim().equals("")) {
errors.add("Missing required parameter 01");
invalidParameters= true;
}
else {
for(int i=0; i<SORT_CODES.length; i++) {
if(firstSortCode.equals(SORT_CODES[i][0])) {
pSort1 = SORT_CODES[i][1];
sort1Attr = SORT_CODES[i][2];
sort1GetDescTable = SORT_CODES[i][3];
sort1GetDescCode = SORT_CODES[i][4];
sort1GetDescValue = SORT_CODES[i][5];
val1 = firstSortCode + " - " + pSort1;
break;
}
}
if(pSort1.equals("")) {
errors.add("Invalid value '"+ firstSortCode + "' for parameter 01");
invalidParameters= true;
}
}
String mainSelectSQL ="SELECT shrdgmr_pidm, " +
" shrdgmr_levl_code, "+
" shrdgmr_grst_code, "
" NVL("+sort1Attr+", 'Not Reported') ";
mainSelectSQL =mainSelectSQL +
"FROM shrdgmr " +
"WHERE shrdgmr_pidm is not null " +
//Appends the ORDER BY clause
mainSelectSQL+= "ORDER BY "+sort1Attr;
//Executes the query and obtains the ResultSet
ResultSet rs= sqlStatement.executeQuery();
String sort1Desc= "***";
String Sort1Prev= "*";
//Arrays to hold the student counts for each of the reported sort values
int sort1Count= 0;
int grandTotal = 0;
while(rs.next()) {
String Value1 = rs.getString(2);
if(!Value1.equals(prevSort1Value)) {
String sort1Record= Library.lPad(sort1Count, REPORT_COL, ' ');
if(!sort1Desc.equals("***")) {
if(lineCount[0]+4>MAX_LINES) {
startNewPage(detailReport, pageCount, lineCount, currentDate,
databaseName, pGradTerm, pInitiator, sort1Desc, pSort1, false);
}
detailReport.add(Library.rPad(sort1Desc, REPORT_COL1, ' ')+sort1Record);
summaryReport.add(Library.rPad(sort1Desc, REPORT_COL1, ' ')+sort1Record);
lineCount[0]++;
}
//Resets the counter
sort1Count =0;
sort1Desc= getSortDescription(connection, pSort1, sort1GetDescValue, sort1GetDescTable,
sort1GetDescCode, Value1, errors);
}
sort1Count++;
我的问题是如何合并重复的项目并总结它们的数量?
例如,我现在的代码只是在我的摘要报告中打印以下内容,
建筑学 40
工程学 56
牙科 66
建筑学 16
计算机科学 10
工程学 11
建筑学 5
输出应该只是:
建筑学 61
工程学 67
牙科 66
计算机科学 10
建筑学 5
我只是坚持如何做到这一点。我正在考虑使用 hashmap 或 hashset,但我不确定如何。感谢您的帮助,谢谢!
解决方案
如果你真的不想在 sql 中使用聚合,你可以使用HashMap<String, Integer>
. 像这样的东西:
Map<String, Integer> aggResult = new HashMap<>();
while (rs.next()) {
String name = rs.getString(NAME_INDEX); //NAME_INDEX - name column index
int value = rs.getInt(VALUE_INDEX); //VALUE_INDEX - value column index
aggResult.merge(name, value, Integer::sum);
//if you dont have java8 use this "if":
/*
if (aggResult.containsKey(name)) {
Integer sum = aggResult.get(name);
aggResult.put(name, sum + value);
} else {
aggResult.put(name, value);
}
*/
}
//test output:
aggResult.forEach((key, value) -> System.out.println(key + ": " + value));
也许您需要TreeMap
(有或没有比较器)来代替HashMap
对来自 ResultSet 或其他东西的值的顺序、空值检查。