2015-02-27 5 views
15

मैं जो निम्न प्रारूप में डेटा शामिल हैं एक फ़ाइलजावा 8 toMap IllegalStateException डुप्लीकेट चाबी

1 
2 
3 

मैं इस लोड करने के लिए के रूप में {(1->1), (2->1), (3->1)}

यह वह जगह है जावा 8 कोड,

मैप करना चाहते हैं
Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile)) 
       .map(line -> line.trim()) 
       .map(Integer::valueOf) 
       .collect(Collectors.toMap(x -> x, x -> 1)); 

मुझे निम्न त्रुटि मिल रही है

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 1 

मैं इस त्रुटि को कैसे ठीक करूं?

+1

फ़ाइल के समान संख्या में दो बार होने पर आप क्या करना चाहेंगे? –

+0

यदि ऐसी कोई स्थिति है, तो मैं उस कुंजी के लिए मानों की संख्या प्राप्त करना चाहता हूं। इसलिए, यदि कुंजी 2 फ़ाइल में 4 बार होता है, तो यह होगा (2-> 4)। – pramodh

+3

फिर आपको इस विधि का उपयोग करने की आवश्यकता होगी: http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java .util.function.Function-java.util.function.BinaryOperator- –

उत्तर

11

यदि फ़ाइल में कोई डुप्लिकेट नहीं है तो कोड चलाएगा।

Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile)) 
      .map(String::trim) 
      .map(Integer::valueOf) 
      .collect(Collectors.toMap(x -> x, x -> 1)); 

यदि डुप्लिकेट हैं तो कुंजी के लिए फ़ाइल में घटनाओं की कुल संख्या प्राप्त करने के लिए निम्न कोड का उपयोग करें।

Map<Integer, Long> map1 = Files.lines(Paths.get(inputFile)) 
      .map(String::trim) 
      .map(Integer::valueOf) 
      .collect(Collectors.groupingBy(x -> x, Collectors.counting()); 
+2

के बजाय मान को प्रिंट करता है आप 'संग्रह (संग्राहक.groupingBy (x -> x, संग्राहक.counting()))' कर सकते हैं 'जो' toMap 'के 3-Arg फॉर्म से स्पष्ट हो सकता है () '। साथ ही, आप 'line -> line.trim()' के बजाय 'स्ट्रिंग :: ट्रिम' का भी उपयोग कर सकते हैं। –

+0

@StuartMarks, मुझे संग्राहक.groupings के लिए चक्रीय अनुमान त्रुटि मिल रही है (x -> x, संग्राहक.counting() – pramodh

+2

आह, 'गिनती() '' Long' में जमा हो जाती है, इसलिए आपको मानचित्र घोषणा को बदलना होगा 'मानचित्र <इंटीजर, लांग>' –