标签匹配(2)
最后得到的结果是最优的 但是读取结果的排序存在问题 因为select语句无法按排好的qid排序。除非新建一个用作排序的量。
明天做最后改动。
public int RelatedTest(int[] qid, int j, int temp) { for (int k = 0; k < j; k++) { if (qid[k] == temp) return k; } return -1; } public List<Question> GetRelatedQuestions(List<Tag> tag) { List<Question> list = new List<Question>(); SqlConnection conn = DbHelper.getConnection(); int[] qid = new int[tag.Count * 10]; int[] resemble = new int[tag.Count * 10]; int j = 0, k = 0, l = 0; int temp1, temp2; string b=""; for(int i=0;i<tag.Count;i++) { if (i != tag.Count - 1) b += "'" + tag[i].Id + "',"; else b += "'" + tag[i].Id + "'"; } SqlDataReader reader = DbHelper.ExecuteReader( String.Format("SELECT QuestionTagAssociation.* FROM [Question],[QuestionTagAssociation] WHERE Question.qid=QuestionTagAssociation.qid and tid in("+b+")" ,conn) ); while (reader.Read()) { int temp = Convert.ToInt32(reader["qid"].ToString()); if (j == 0) { qid[j++] = temp; resemble[0] = 1; } else { int a = RelatedTest(qid, j, temp); if (a < 0) { resemble[j] = 1; qid[j++] = temp; } else { resemble[a]++; } } } if (j > 10) l = 10; else l = j; for (int i = 0; i < l; i++) //进行l次选择排序 { int index = i; for (k= index + 1; k <j ; k++) { if (resemble[k] > resemble[index]) index = k; } temp2 = resemble[index]; resemble[index] = resemble[i]; resemble[i] = temp2; temp1 = qid[index]; qid[index] = qid[i]; qid[i] = temp1; } b = ""; for (int i = 0; i < l; i++) { if (i != l - 1) b += "'" + qid[i]+ "',"; else b += "'" + qid[i]+ "'"; } SqlDataReader reader2 = DbHelper.ExecuteReader( String.Format("SELECT Question.* FROM [Question] WHERE Question.qid in(" + b+ ") order by "+qid+"") , conn ); fillQuestionList(list, reader2); return list; }