2012-05-22 10 views
43

मेरी फाइल रों पार्स करने के बाद AttributeGet:1,16,10106,10111Convert सूची <String> सूची में <Integer> सीधे

तो मैं attributeIDGet सूची में अर्द्ध कोलन के बाद सभी नंबरों की आवश्यकता होती है। मुझे पता है कि ऐसा करने के कई तरीके हैं। लेकिन क्या कोई तरीका है कि हम सीधे List<String> से List<Integer> परिवर्तित कर सकते हैं। जैसा कि नीचे दिया गया कोड टाइप मिस्चैच के बारे में शिकायत करता है, इसलिए मैंने Integer.parseInt करने का प्रयास किया, लेकिन मुझे लगता है कि यह सूची के लिए काम नहीं करेगा। यहाँ स्ट्रिंग है।

private static List<Integer> attributeIDGet = new ArrayList<Integer>();; 

if(s.contains("AttributeGet:")) { 
    attributeIDGet = Arrays.asList(s.split(":")[1].split(",")); 
} 

उत्तर

50

नहीं, आप सरणी

for(String s : strList) intList.add(Integer.valueOf(s)); 
+2

क्या आपने लिखा है ef मूल्यों पर fectively looping। लेकिन फिर भी यह एक सुरुचिपूर्ण समाधान है। बस उसमें जोड़ने के लिए। नई लैम्ब्डा विधियों के साथ। 'intList.addAll (strList.stream()। नक्शा (इंटीजर :: valueOf) .collect (collect.toList())); – frugalcoder

+1

या यहां तक ​​कि strList.foreach (s-> intList.add (Integer.valueOf (एस)); – Heisenberg

+3

फास्ट फॉरवर्ड 5 साल और अब नीचे दिए गए उत्तर हैं जो एक लूप का उपयोग किए बिना एक लाइन में ऐसा करने के लिए जावा 8 स्ट्रीम का उपयोग करते हैं। – Catfish

8

नहीं, आप प्रत्येक तत्व से अधिक पुनरावृति करना होगा:

for(String number : numbers) { 
    numberList.add(Integer.parseInt(number)); 
} 

कारण ऐसा होता है कोई सरल तरीके किसी अन्य प्रकार में एक प्रकार की एक सूची कन्वर्ट करने के लिए है कि वहाँ है। कुछ रूपांतरण संभव नहीं हैं, या एक विशिष्ट तरीके से किया जाना चाहिए। अनिवार्य रूप से रूपांतरण शामिल वस्तुओं और रूपांतरण के संदर्भ पर निर्भर करता है, इसलिए कोई भी "एक आकार सभी फिट बैठता है" समाधान नहीं है। उदाहरण के लिए, यदि आपके पास Car ऑब्जेक्ट और Person ऑब्जेक्ट था। आप को List<Person> में सीधे रूपांतरित नहीं कर सकते हैं क्योंकि यह वास्तव में समझ में नहीं आता है।

1

कोई अधिक पाश की जरूरत है, वहाँ कोई रास्ता नहीं है (है कि मैं के बारे में पता), जावा में कर रही है कि के।

असल में आपको प्रत्येक प्रविष्टि को स्ट्रिंग से इंटीजर में बदलना होगा।

जो आप खोज रहे हैं उसे अधिक कार्यात्मक भाषा में हासिल किया जा सकता है, जहां आप एक परिवर्तन समारोह पारित कर सकते हैं और इसे सूची के हर तत्व पर लागू कर सकते हैं ... लेकिन ऐसा संभव नहीं है (यह अभी भी प्रत्येक पर लागू होगा सूची में तत्व)।

Overkill:

हालांकि (गूगल अमरूद से एक समारोह http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function उपयोग कर सकते हैं .html) एक और अधिक कार्यात्मक दृष्टिकोण अनुकरण करने के लिए, यदि आप यही चाहते हैं।

यदि आप दो बार सूची में पुनरावृत्त करने के बारे में चिंतित हैं, तो विभाजन के बजाय एक टोकननाइज़र का उपयोग करने और प्रत्येक पूर्णांक टोकन को इंटीजर में बदलने के बजाय सूची में जोड़ने से पहले।

+0

'फंक्शन' का उपयोग करना यहां पर ओवरकिल है। –

+0

मुझे पता है, यह हासिल नहीं होगा दक्षता के मामले में कुछ भी * यह * ओवरकिल है, मैं केवल इसे "कार्यात्मक" दृष्टिकोण अनुकरण करने के तरीके के रूप में इंगित करना चाहता था। दुर्भाग्यवश, आप केवल उस व्यवहार की नकल कर रहे हैं और आमतौर पर ब्लोटेड कोड के साथ समाप्त होते हैं। – pcalcao

7

आप Google Guava library का उपयोग इस आप क्या कर सकते हैं, तो Lists#transform

String s = "AttributeGet:1,16,10106,10111"; 


    List<Integer> attributeIDGet = new ArrayList<Integer>(); 

    if(s.contains("AttributeGet:")) { 
     List<String> attributeIDGetS = Arrays.asList(s.split(":")[1].split(",")); 
     attributeIDGet = 
     Lists.transform(attributeIDGetS, new Function<String, Integer>() { 
      public Integer apply(String e) { 
       return Integer.parseInt(e); 
      }; 
     }); 
    } 

हां देखते हैं, इसके बाद के संस्करण जवाब यह है कि यह फूला हुआ है, लेकिन स्टाइलिश है के साथ सहमत हैं। लेकिन यह सिर्फ एक और तरीका है।

0

यहां गुवा की शक्ति दिखाने के लिए एक और उदाहरण है। हालांकि, यह कोड लिखने का तरीका नहीं है, मैं यह दिखाने के लिए सभी को एक साथ पैक करना चाहता था कि जावा किस प्रकार के कार्यात्मक प्रोग्रामिंग जावा जावा के लिए प्रदान करता है।

Function<String, Integer> strToInt=new Function<String, Integer>() { 
    public Integer apply(String e) { 
     return Integer.parseInt(e); 
    } 
}; 
String s = "AttributeGet:1,16,10106,10111"; 

List<Integer> attributeIDGet =(s.contains("AttributeGet:"))? 
    FluentIterable 
    .from(Iterables.skip(Splitter.on(CharMatcher.anyOf(";,")).split(s)), 1)) 
    .transform(strToInt) 
    .toImmutableList(): 
    new ArrayList<Integer>(); 
2

आप जावा 8 से lambdas उपयोग करने की अनुमति है, तो आप निम्नलिखित कोड नमूना उपयोग कर सकते हैं।

final String text = "1:2:3:4:5"; 
final List<Integer> list = Arrays.asList(text.split(":")).stream() 
    .map(s -> Integer.parseInt(s)) 
    .collect(Collectors.toList()); 
System.out.println(list); 

बाहरी पुस्तकालयों का कोई उपयोग नहीं। सादा पुराना नया जावा!

+0

I इस वाक्यविन्यास त्रुटि को प्राप्त कर रहा हूं: मिस्चैच टाइप करें: स्ट्रिंग से int के अंदर नक्शा फ़ंक्शन में कनवर्ट नहीं किया जा सकता है। क्या आप इस –

+0

@SonalMheshwari के साथ मेरी सहायता कर सकते हैं जावा का कौन सा संस्करण आप उपयोग कर रहे हैं (और किस पर्यावरण पर)? मैं मैक ओएस एक्स पर '1.8.0_05' पर हूं। क्या आप एक [एसएससीसीई] (http://www.sscce.org) भी प्रदान कर सकते हैं ([पेस्टबिन] (http://pastebin.com) या समकक्ष)? – javatarz

+0

सर्वोत्तम उत्तर यहां –

4

स्ट्रिंग्स की सूची को पूर्णांक की सूची में बदलने के लिए आप स्ट्रीम का उपयोग क्यों नहीं करते?

List<String> stringList = new ArrayList<String>(Arrays.asList("10", "30", "40", 
      "50", "60", "70")); 
List<Integer> integerList = stringList.stream() 
      .map(Integer::valueOf).collect(Collectors.toList()); 

नीचे की तरह पूरा आपरेशन इस

String s = "AttributeGet:1,16,10106,10111"; 
List<Integer> integerList = (s.startsWith("AttributeGet:")) ? 
    Arrays.asList(s.replace("AttributeGet:", "").split(",")) 
    .stream().map(Integer::valueOf).collect(Collectors.toList()) 
    : new ArrayList<Integer>(); 
9

Guava Converters की तरह कुछ हो सकता है चाल है।

import com.google.common.base.Splitter; 
import com.google.common.primitives.Longs; 

final Iterable<Long> longIds = 
    Longs.stringConverter().convertAll(
     Splitter.on(',').trimResults().omitEmptyStrings() 
      .splitToList("1,2,3")); 
9

का उपयोग लैम्ब्डा:

strList.stream().map(org.apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());

1

आप

String string = "1, 2, 3, 4"; 
    List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList()); 
33

पाशन Java8 का उपयोग करते हुए बिना इस लक्ष्य को हासिल करने के लिए जावा 8 की Lambda प्रकार्य का उपयोग कर सकते हैं:

stringList.stream().map(Integer::parseInt).collect(Collectors.toList()); 
+0

साफ। मुझें यह पसंद है। –

+0

यदि विधि के लिए स्ट्रिंगलिस्ट भेजें (सूची ) नहीं कर सकते हैं। मुझे लगता है कि नई सूची और लूप – Adam

+0

जे 8 के बाद के लिए सबसे अच्छा जवाब बनाने की आवश्यकता है। – Leon

संबंधित मुद्दे