簡體   English   中英

數組被最后一個項目覆蓋

[英]Array getting overwritten with the last item java

我的數組被最后一個對象覆蓋,並且不確定為什么在同一位置上的System.out.println()正確打印所有項目。 我正在嘗試更新包含學生分數及其排名的表格,但所有學生都將獲得數組中的最后一項。

public static void updateSubjectRank(String subject, String extype, int academicyear, int semester, int level) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(EduResults.class);
            cr.add(Restrictions.eq("subject", subject));
            cr.add(Restrictions.eq("extype", extype));
            cr.add(Restrictions.eq("acedemicyear", academicyear));
            cr.add(Restrictions.eq("semester", semester));
            cr.add(Restrictions.eq("level", level));
            ScrollableResults items = cr.scroll();
            int count = 0;
            double[] scores = getSubjectScores(subject, extype, academicyear, semester, level);//this gets all the scores in a double array
            int[] ranks = Rank.getRank(scores);//this gives me the ranks of the scores above
            while (items.next()) {
                EduResults res = (EduResults) items.get(0);
                for (int i : ranks) {
                    res.setSubjectRank(i + 1);//this updates the database with the last item in the array
                    System.out.println(i+1);///this prints the ranks properly
                    session.saveOrUpdate(res);
                }
                if (++count % 100 == 0) {
                    session.flush();
                    session.clear();
                }
            }
            tx.commit();
        } catch (Exception asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
    }

我已經看到過類似的問題,但是當系統正確打印它們時,這看起來很奇怪。 我在這里想念什么嗎?

res.setSubjectRank(i + 1); 這行不是在循環中反復更新主題排名嗎? 您期望這做什么? 在第一個迭代中,它將對其進行更新,並將一直更新到最后一個迭代,並且最后一個迭代將具有ranks數組中的最后一項。

我終於找到了解決方法。 我將為可能遇到相同問題的任何人發布答案。 由於具有相同分數的學生將具有相同的排名,因此您可以迭代每個分數並更新排名。 像這樣:

public static void updateSubjectRank(String subject, String extype, int academicyear, int semester, int level) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            double[] scores = getSubjectScores(subject, extype, academicyear, semester, level);
            int[] ranks = Rank.getRank(scores);
            for (double d : scores) {
                Criteria cr = session.createCriteria(EduResults.class);
                int rank = Rank.getRank(Rank.getRank(scores), Rank.getArrayIndex(scores, d)) + 1;
                cr.add(Restrictions.eq("subject", subject));
                cr.add(Restrictions.eq("extype", extype));
                cr.add(Restrictions.eq("acedemicyear", academicyear));
                cr.add(Restrictions.eq("semester", semester));
                cr.add(Restrictions.eq("level", level));
                cr.add(Restrictions.eq("scorePcnt", d));
                ScrollableResults items = cr.scroll();
                int count = 0;
                while (items.next()) {
                    EduResults res = (EduResults) items.get(0);
                    res.setSubjectRank(rank);
                    System.out.println(rank);
                    session.saveOrUpdate(res);
                    if (++count % 100 == 0) {
                        session.flush();
                        session.clear();
                    }
                }
            }

            tx.commit();
        } catch (Exception asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM