कैसे अल्पविराम से स्ट्रिंग को ArrayList में परिवर्तित करें?


538

क्या जावा में कोई बिल्ट-इन विधि है जो हमें कॉमा से अलग किए गए स्ट्रिंग को कुछ कंटेनर में बदलने की अनुमति देता है (जैसे सरणी, सूची या वेक्टर)? या क्या मुझे उसके लिए कस्टम कोड लिखने की आवश्यकता है?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??

यदि आप CSV को पार्स करना चाहते हैं तो stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald

@ राॅडवल्ड वह नहीं है जो ओपी ने हालांकि मांगा था
क्रॉउनी

3
केवल ColinD का उत्तर यहाँ सही है, यह मानते हुए कि आप प्रश्न शीर्षक में एक ArrayList चाहते हैं। ArrayList (जो कि परिवर्तनशील है) पूरी तरह से List से अलग है, जो कि केवल एक साधारण निश्चित सूची हो सकती है।
फटी

@ फैटी - उचित बिंदु, और तय किया गया कि - stackoverflow.com/a/34735419/744133
YoYo

1
जावा 8 समाधान: stackoverflow.com/a/46485179/1216775
akhil_mittal

जवाबों:


1016

कन्वर्ट अल्पविराम को स्ट्रिंग सूची में अलग कर दिया

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));

उपर्युक्त कोड स्ट्रिंग को एक सीमांकक के रूप में परिभाषित करता है: zero or more whitespace, a literal comma, zero or more whitespaceजो शब्दों को सूची में रखेगा और शब्दों और अल्पविराम के बीच किसी भी व्हाट्सएप को ध्वस्त करेगा।


कृपया ध्यान दें कि यह एक सरणी पर केवल एक आवरण देता है: आप परिणाम से उदाहरण के लिए नहीं कर सकते । एक वास्तविक के लिए आपको आगे उपयोग करना होगा ।.remove()ListArrayListnew ArrayList<String>


39
@ ब्रोच इसकी एक नियमित अभिव्यक्ति (रेगेक्स) है। \sकिसी भी श्वेत स्थान से मेल खाता है, *मैच शून्य या अधिक बार लागू होता है। तो \s*इसका अर्थ है "किसी भी श्वेत स्थान को शून्य या अधिक बार मेल करें"। हम कॉमा से पहले और बाद में इसके लिए देखते हैं। इसलिए, विभाजन स्ट्रिंग्स के लिए काम करेगा जैसे "item1 , item2 , item3", या "item1,item2 ,item3", आदि। जावा में, आपको स्ट्रिंग्स में बैकस्लैश से बचने की आवश्यकता है, इसलिए आपको मिलता है\\s*
andrrjones

9
मैं "[\\s,]+"मूल्यों के लिए सफेद रिक्त स्थान को ट्रिम करने के लिए उपयोग करने का सुझाव देता हूं । उदाहरण के लिए, " item1 , item2 , item3 , "बन जाता है ["item1", "item2", "item3"]
एंड्री नेमेन्चेंको

5
"[\\s,]+"कॉमा द्वारा अलग किए गए टोकन के भीतर आंतरिक स्थान पर भी विभाजित हो जाएगा, यह दोनों व्हाट्सएप को एक सीमांकक के बजाय किसी भी संख्या में आसपास के व्हाट्सएप के बजाय एक कॉमा मौजूद नहीं होने पर भी एक सीमांकक के रूप में मानेगा। "\\s*(,\\s*)+"केवल कॉमा को अलग किए गए टोकन के आसपास व्हाट्सएप ट्रिम कर देगा, और किसी भी तार को अनदेखा कर देगा जो केवल व्हाट्सएप या खाली हैं।
1832 में theferrit32

2
एक साइड नोट के रूप में: यदि आप खाली इनपुट स्ट्रिंग के मामले में खाली सूची प्राप्त करने की उम्मीद करते हैं, तो यह विधि आपके उपयोग के मामले के अनुरूप नहीं है। आपको रिक्त स्ट्रिंग वाले 1 तत्व के साथ एक सूची मिलेगी।
मैडिस पुक्कोनैन

3
@AlexR हालांकि मैं सराहना करता हूं कि आप ओपी का सम्मान करते हैं, लेकिन, मैं ऐसी बातें कहने से बचना चाहूंगा। मैं ऐसे लोगों के बारे में जानता हूं जो झूठी तारीफ करने पर लोगों की उम्मीदों पर खरे नहीं उतरते। सिर्फ एक विचार।

199

Arrays.asListListसरणी द्वारा समर्थित निश्चित आकार देता है । यदि आप एक सामान्य परिवर्तनशील चाहते हैं, तो आपको java.util.ArrayListऐसा करने की आवश्यकता है:

List<String> list = new ArrayList<String>(Arrays.asList(string.split(" , ")));

या, अमरूद का उपयोग कर :

List<String> list = Lists.newArrayList(Splitter.on(" , ").split(string));

एक का उपयोग करते हुए Splitterआप आप स्ट्रिंग कैसे विभाजित में और अधिक लचीलापन देता है और आप के लिए, उदाहरण के लिए, परिणाम और ट्रिम परिणामों में रिक्त स्ट्रिंग को छोड़ क्षमता देता है। यह भी कम अजीब व्यवहार के String.splitसाथ-साथ regex द्वारा विभाजित करने की आवश्यकता नहीं है (यह सिर्फ एक विकल्प है)।


6
स्प्लिटर.ऑन (",") को पसंद किया होगा । ट्राइमेन्सल्ट्स ()। स्प्लिट (स्ट्रिंग) हालांकि मैं देख रहा हूं कि आपने इसका उल्लेख किया है। तो +1
जॉन बी

10
+1 यह बताने के लिए कि Arrays.asList एक सामान्य सूची नहीं लौटाता है। यदि आप उस सूची में / से एक तत्व जोड़ने / हटाने का प्रयास करते हैं, तो आपको एक UnsupportedOperationException मिलेगी।
अल्फ्रेडो ओसोरियो

9
अमरूद के बाद से यह (15.0): Splitter.on (",")। स्प्लिटटॉइस्ट (स्ट्रिंग) । एक छोटा कदम बचाता है।
Kango_V

क्या स्ट्रिंग स्ट्रिंग में भी खाली मान जोड़ने का कोई तरीका है अगर मैं इस तरह स्ट्रिंग कर रहा हूँ: 1, 3,4,5 यहाँ 2 गायब या खाली है। जब सूची 2 में परिवर्तित हो जाएगा। लेकिन मैं इसे खाली मूल्य के रूप में जोड़ना चाहता हूं।
A.Aleem11

इस कार्यान्वयन, और कुछ अन्य समान उदाहरणों के साथ समस्या यह है कि यद्यपि Arrays.asListमूल सरणी के चारों ओर एक आवरण प्रदान करता है (एक तत्व प्रतिलिपि से परहेज), new ArrayList(...)तत्व प्रतिलिपि द्वारा इस तरह के तत्व को ठीक से करेगा। हमें संभवतः एक दृष्टिकोण पसंद करना चाहिए जो पार्स किए गए तत्वों को वांछित लक्ष्य संग्रह में सीधे जोड़ा जा सकता है।
योयो

70

दो चरण:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);

1
एक बार जब आप आइटम चर को इनलाइन कर लेते हैं, तो यह मूल रूप से अन्य उत्तरों के समान होता है, लेकिन वास्तव में थोड़ा अधिक कुशल होता है क्योंकि यह रेगेक्स का उपयोग नहीं करता है। दूसरी तरफ, अल्पविराम के चारों ओर रिक्त स्थान इस विकल्प को मार देंगे।
अमरिंदर अरोरा

2
@ArrinderArora तर्क को splitएक RegEx के रूप में व्याख्या किया गया है।
मैडब्रिक्स

23

यहाँ एक और CSV को ArrayList में बदलने के लिए है:

String str="string,with,comma";
ArrayList aList= new ArrayList(Arrays.asList(str.split(",")));
for(int i=0;i<aList.size();i++)
{
    System.out.println(" -->"+aList.get(i));
}

आपको प्रिंट करता है

-> स्ट्रिंग
-> साथ
-> अल्पविराम


21

यदि Listओपी के अनुसार एक अंतिम लक्ष्य है, तो पहले से ही स्वीकृत उत्तर अभी भी सबसे छोटा और सबसे अच्छा है। हालांकि मैं जावा 8 स्ट्रीम का उपयोग करके विकल्प प्रदान करना चाहता हूं , जो आगे की प्रक्रिया के लिए पाइपलाइन का हिस्सा होने पर आपको अधिक लाभ देगा।

.Split फ़ंक्शन (एक मूल सरणी) के परिणाम को एक स्ट्रीम में लपेटकर और फिर एक सूची में परिवर्तित करके।

List<String> list =
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toList());

यदि यह महत्वपूर्ण है कि परिणाम ArrayListओपी से शीर्षक के अनुसार संग्रहीत है , तो आप एक अलग Collectorविधि का उपयोग कर सकते हैं :

ArrayList<String> list = 
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toCollection(ArrayList<String>::new));

या RegEx पार्सिंग एपीआई का उपयोग करके:

ArrayList<String> list = 
  Pattern.compile(",")
  .splitAsStream("a,b,c")
  .collect(Collectors.toCollection(ArrayList<String>::new));

ध्यान दें कि आप अभी भी बदले listगए चर को छोड़ने पर विचार कर सकते List<String>हैं ArrayList<String>Listअभी भी सामान्य इंटरफ़ेस ArrayListकार्यान्वयन के लिए पर्याप्त समान है ।

अपने आप से, ये कोड उदाहरण बहुत कुछ जोड़ने के लिए नहीं लगते हैं (अधिक टाइपिंग को छोड़कर), लेकिन यदि आप और अधिक करने की योजना बना रहे हैं, तो इस उत्तर को स्ट्रिंग को सूची में शामिल करने की छूट देने पर छूट देता है, स्ट्रीमिंग एपीआई वास्तव में अनुमति देकर शक्तिशाली है एक के बाद एक अपने ऑपरेशन को पाइपलाइन करने के लिए।

के लिए, आप जानते हैं, पूर्णता।


19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());

1
अब सबसे अच्छा जवाब में से एक। सूची को इस उत्तर में बदला जा सकता है +1।
सेड्रिक

के बाद काम करता collect(toList())हैcollect(Collectors.toList()
सुंदरराज गोविंदसामी

वास्तव collect(toList())में Collectors.toList()संक्षिप्तता और प्रवाह के लिए स्थैतिक आयात का उपयोग किया जाता है :)
मनु

15

इसके लिए कोई अंतर्निहित पद्धति नहीं है लेकिन आप बस इसमें विभाजन () विधि का उपयोग कर सकते हैं।

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = 
new  ArrayList<String>(Arrays.asList(commaSeparated.split(",")));


10

आप asList और विभाजन को जोड़ सकते हैं

Arrays.asList(CommaSeparated.split("\\s*,\\s*"))

8

यह कोड मदद करेगा,

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));

5

आप स्ट्रिंग को विभाजित करने के लिए अमरूद का उपयोग कर सकते हैं, और इसे एक ArrayList में बदल सकते हैं। यह एक खाली स्ट्रिंग के साथ भी काम करता है, और एक खाली सूची देता है।

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

String commaSeparated = "item1 , item2 , item3";

// Split string into list, trimming each item and removing empty items
ArrayList<String> list = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().splitToList(commaSeparated));
System.out.println(list);

list.add("another item");
System.out.println(list);

निम्नलिखित आउटपुट:

[item1, item2, item3]
[item1, item2, item3, another item]

4

एक उदाहरण का उपयोग करते हुए Collections

import java.util.Collections;
 ...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
 ...

1
आपने मध्यस्थ Arrays.asList से परहेज किया। दुर्भाग्य से हम अभी भी संग्रह में सरणी तत्वों से एक प्रतिलिपि है। याद करने का अच्छा विकल्प।
योयो

4

जावा 8 में धाराओं का उपयोग करके इसे हल करने के कई तरीके हैं लेकिन IMO निम्नलिखित एक लाइनर सीधे आगे हैं:

String  commaSeparated = "item1 , item2 , item3";
List<String> result1 = Arrays.stream(commaSeparated.split(" , "))
                                             .collect(Collectors.toList());
List<String> result2 = Stream.of(commaSeparated.split(" , "))
                                             .collect(Collectors.toList());

क्या किसी को पता है कि मैं इस स्ट्रिंग को अल्पविराम से अलग सूची में कैसे बदल सकता हूं --String s = "2017-07-12 23: 40: 00.0,153.76,16.140,60.00, 56.00,"; सूची <string> splittedString = new ArrayList <string> (Arrays.asList (s.split ("\\ s *, \\ s *")));
सनी

1
यह एक नया प्रश्न है, इसे टिप्पणी के रूप में न पूछें। एक नया प्रश्न बनाने के लिए स्वतंत्र महसूस करें।
बजे जॉर्ज सिगुरोलोगो

2

आप पहले उन्हें उपयोग करके विभाजित कर सकते हैं String.split(","), और फिर लौटे स्ट्रिंग arrayका ArrayListउपयोग करके परिवर्तित कर सकते हैंArrays.asList(array)


2

ग्रूवी में, आप टोकन (कैरेक्टर टोकन) विधि का उपयोग कर सकते हैं:

list = str.tokenize(',')

इसने मुझे बचाया! धन्यवाद।
ताम्रलाहा

2

समान परिणाम आप स्प्लिटर वर्ग का उपयोग करके प्राप्त कर सकते हैं।

var list = Splitter.on(",").splitToList(YourStringVariable)

(कोटलिन में लिखा)


1
प्रलेखन का कहना है कि यह फ़ंक्शन बीटा और अस्थिर है।
रबरडुकर


1

मैं आमतौर पर सूची के लिए precompiled पैटर्न का उपयोग करता हूं। और यह भी थोड़ा अधिक सार्वभौमिक है क्योंकि यह कोष्ठक पर विचार कर सकता है जो सूची के कुछ भावों का अनुसरण करता है।

private static final Pattern listAsString = Pattern.compile("^\\[?([^\\[\\]]*)\\]?$");

private List<String> getList(String value) {
  Matcher matcher = listAsString.matcher((String) value);
  if (matcher.matches()) {
    String[] split = matcher.group(matcher.groupCount()).split("\\s*,\\s*");
    return new ArrayList<>(Arrays.asList(split));
  }
  return Collections.emptyList();

1

कोटलिन में अगर आपकी स्ट्रिंग सूची इस तरह की है और आप कन्वर्ट स्ट्रिंग के लिए ArrayList कोड की इस लाइन का उपयोग कर सकते हैं

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")


0

आप इसे निम्नानुसार कर सकते हैं।

यह सफेद स्थान को हटा देता है और अल्पविराम द्वारा विभाजित हो जाता है जहां आपको सफेद रिक्त स्थान के बारे में चिंता करने की आवश्यकता नहीं होती है।

    String myString= "A, B, C, D";

    //Remove whitespace and split by comma 
    List<String> finalString= Arrays.asList(myString.split("\\s*,\\s*"));

    System.out.println(finalString);

-1

स्ट्रिंग -> संग्रह रूपांतरण: (स्ट्रिंग -> स्ट्रिंग [] -> संग्रह)

//         java version 8

String str = "aa,bb,cc,dd,aa,ss,bb,ee,aa,zz,dd,ff,hh";

//          Collection,
//          Set , List,
//      HashSet , ArrayList ...
// (____________________________)
// ||                          ||
// \/                          \/
Collection<String> col = new HashSet<>(Stream.of(str.split(",")).collect(Collectors.toList()));

संग्रह -> स्ट्रिंग [] रूपांतरण:

String[] se = col.toArray(new String[col.size()]);

स्ट्रिंग -> स्ट्रिंग [] रूपांतरण:

String[] strArr = str.split(",");

और संग्रह -> संग्रह :

List<String> list = new LinkedList<>(col);

-2

जावा 8 में अल्पविराम में संग्रह को स्ट्रिंग में परिवर्तित करें

listOfString ऑब्जेक्ट में ["A", "B", "C", "D"] तत्व शामिल हैं-

listOfString.stream().map(ele->"'"+ele+"'").collect(Collectors.joining(","))

आउटपुट है: - 'ए', 'बी', 'सी', 'डी'

और जावा 8 में स्ट्रिंग्स एरे को सूची में बदलें

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());

-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");

5
और वास्तव में कहाँ है ArrayList? क्या आपने प्रश्न भी पढ़ा है?
देबोसमित रे

@ पैरामीटर्स: एक था ArrayList। मैंने संपादन को पहले संशोधन में वापस ले लिया (ताकि आप इसे देख सकें) और पहले संशोधन के प्रारूपण में सुधार किया।
दुर

प्रश्न यह है कि स्ट्रिंग को ArrayList में कैसे परिवर्तित किया जाए, ArrayList को Array में कैसे परिवर्तित किया जाए।
कॉमरेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.