2017-04-19 60 views
1

我有如下表获取不同的对象从列表中的Java

question_text_id question_id language_id question_text 
2     7   1   english_text_1 
3     7   2   spanish_text_1 
4     8   2   spanish_text_2 
5     8   1   english_text_2 

现在我要为每个不同的question_id

创建列表我用下面的代码

List<QuestionText> questionTextList = questionManager.getQuestionsTextByQuestionId(Long.parseLong(questions.getQuestionId().toString())); 
for (QuestionText questionText : questionTextList) { 
    questionMap.put("questionId", questionText.getQuestionId()); 
    questionMap.put("language", questionText.getLanguageId()); 
    if(questionText.getLanguageId().longValue() == 1){ 
     questionMap.put("englishQuestionText",questionText.getQuestionText()); 
    } else { 
     questionMap.put("spanishQuestionText",questionText.getQuestionText()); 
    } 
    questionListMap.add(questionMap); 
}    
adminCollectionBookendModel.put("questionListMap",questionListMap);  

[{questionId = 1,language=1, englishQuestionText = english_text_1,spanishQuestionText=spanish_text_1},{questionId = 1,language=2, englishQuestionText = english_text_1,spanishQuestionText=spanish_text_1}] 

但是,这给予我重复相同的数据对象,如果我有西班牙文和英文问题文本如上所示。如何获得唯一的列表?

如何同时获取每个question_id的西班牙文本和英文文本以及language_id并访问它?

请帮我在这

+1

你'questionListMap'列表类型只包含相同的对象多次。即使您在每次迭代中创建新地图,也不会得到预期结果。你需要做的是在每次迭代中查看列表,看看当前问题是否已经有地图,并设置其英文或西班牙文本。 – Titus

+1

要添加到以前的评论中,您将无法为地图中的'language'属性添加不同的值,因为它将被覆盖。如果您希望languageIds适用于两种语言及其文本,则可能必须考虑以不同的方式来存储此属性。 – user2004685

+0

@ user2004685其他的工作也很好,请告诉我如何达到我的要求 – allDroid

回答

0

的第一步是创建一个POJO类就是这样,

public class QuestionDetails { 

    private int questionId; 
    private int englishLanguageId; 
    private int spanishLanguageId; 
    private String englishLanguageText; 
    private String spanishLanguageText; 

    public int getQuestionId() { 
     return questionId; 
    } 

    public void setQuestionId(int questionId) { 
     this.questionId = questionId; 
    } 

    public int getEnglishLanguageId() { 
     return englishLanguageId; 
    } 

    public void setEnglishLanguageId(int englishLanguageId) { 
     this.englishLanguageId = englishLanguageId; 
    } 

    public int getSpanishLanguageId() { 
     return spanishLanguageId; 
    } 

    public void setSpanishLanguageId(int spanishLanguageId) { 
     this.spanishLanguageId = spanishLanguageId; 
    } 

    public String getEnglishLanguageText() { 
     return englishLanguageText; 
    } 

    public void setEnglishLanguageText(String englishLanguageText) { 
     this.englishLanguageText = englishLanguageText; 
    } 

    public String getSpanishLanguageText() { 
     return spanishLanguageText; 
    } 

    public void setSpanishLanguageText(String spanishLanguageText) { 
     this.spanishLanguageText = spanishLanguageText; 
    } 

    @Override 
    public String toString() { 
     return new StringBuilder().append("questionId: ").append(questionId) 
       .append(" ,englishLanguageId: ").append(englishLanguageId) 
       .append(" ,englishLanguageText: ").append(englishLanguageText) 
       .append(" ,spanishLanguageId: ").append(spanishLanguageId) 
       .append(" ,spanishLanguageText: ").append(spanishLanguageText) 
       .toString(); 
    } 
} 

下一步将会改变你的代码片段是这样的:

List<QuestionDetails> questionsList = new ArrayList<>(); 
List<QuestionText> questionTextList = questionManager 
     .getQuestionsTextByQuestionId(Long.parseLong(questions 
       .getQuestionId().toString())); 
for (QuestionText questionText : questionTextList) { 
    /* Get QuestionDetails Object */ 
    QuestionDetails qd = getQuestionDetails(
      questionText.getQuestionId(), questionsList); 
    /* Check Null */ 
    if(null == qd) { 
     /* Get New Object */ 
     qd = new QuestionDetails(); 
     /* Add Object To List */ 
     questionsList.add(qd); 
    } 
    /* Set Question ID */ 
    qd.setQuestionId(questionText.getQuestionId()); 
    /* Set Language ID & Text */ 
    if (questionText.getLanguageId().longValue() == 1) { 
     qd.setEnglishLanguageId(questionText.getLanguageId() 
       .longValue()); 
     qd.setEnglishLanguageText(questionText.getQuestionText()); 
    } else { 
     qd.setSpanishLanguageId(questionText.getLanguageId() 
       .longValue()); 
     qd.setSpanishLanguageText(questionText.getQuestionText()); 
    } 
} 
adminCollectionBookendModel.put("questionListMap", questionsList); 

最后,这里是执行getQuestionDetails函数:

private QuestionDetails getQuestionDetails(int questionId, 
     List<QuestionDetails> questionsList) { 
    /* Search Existing Object */ 
    for (QuestionDetails qd : questionsList) { 
     /* Match Found */ 
     if (qd.getQuestionId() == questionId) { 
      return qd; 
     } 
    } 

    /* No Object Found */ 
    return null; 
} 
+0

这是给我同样的对象重复5次 – allDroid

+0

@allDroid更新了解决方案。它应该现在工作正常。 – user2004685

+0

它的工作表示感谢 – allDroid

0

我建议做以下几点:

为了区分QuestionText,您需要使用question_text_id覆盖equals方法。否则两个相同的问题question_id,但不同的语言文本将是平等的。

然后为每种语言创建两个单独的地图。然后只需遍历所有问题,并通过question_id将每个问题放在相应的地图中。您可以通过它question_id retrive一个问题对象,并从中获得所有必要的领域,包括西班牙文/英文文本

List<QuestionText> questionTextList = questionManager.getQuestionsTextByQuestionId(Long.parseLong(questions.getQuestionTextId().toString())); 
for (QuestionText questionText : questionTextList) { 

    if(questionText.getLanguageId().longValue() == 1){ 
     englishQuestionMap.put("question_id",questionText); 
    } else { 
     spanishQuestionMap.put("question_id",questionText); 
    } 
    questionListMap.add(questionMap); 
}    

所以,你的地图将有Map<Long, QuestionText>