কমা-বিচ্ছিন্ন স্ট্রিংকে অ্যারেলিস্টে কীভাবে রূপান্তর করবেন?


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
কেবল কোলিন্ডের উত্তর এখানে সঠিক, অনুমান করে আপনি প্রশ্নের শিরোনামের মতো একটি অ্যারেলিস্ট চান। অ্যারেলিস্ট (যা পরিবর্তনযোগ্য) তালিকা থেকে সম্পূর্ণ আলাদা, যা কেবল একটি সাধারণ নির্দিষ্ট তালিকা হতে পারে।
ফ্যাটি

@Fattie - ন্যায্য পয়েন্ট, এবং স্থির যে - 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()ফল থেকে List। বাস্তবের জন্য ArrayListআপনাকে অবশ্যই আরও ব্যবহার করতে হবে new ArrayList<String>


39
@ ক্রোস এটির একটি নিয়মিত অভিব্যক্তি (regex)। \sকোনও সাদা স্থানের সাথে *মেলে, ম্যাচটি শূন্য বা তার বেশি বার প্রয়োগ করে। সুতরাং \s*"কোনও শূণ্য স্থান শূন্য বা তার বেশি বারের সাথে মিলে যায়" means আমরা কমা এর আগে এবং পরে এটি সন্ধান করি। সুতরাং, বিভাজনটি জাভাতে "item1 , item2 , item3", বা "item1,item2 ,item3"ইত্যাদির মতো স্ট্রিংয়ের জন্য কাজ করবে , আপনার স্ট্রিংগুলিতে ব্যাকস্ল্যাশ এড়াতে হবে, তাই আপনি পাবেন\\s*
অ্যান্ড্রুজোনস

9
আমি "[\\s,]+"মানগুলির জন্য সাদা স্পেসগুলি ছাঁটাই করতে ব্যবহার করার পরামর্শ দিই । উদাহরণস্বরূপ, " item1 , item2 , item3 , "হয়ে যায় ["item1", "item2", "item3"]
অ্যান্ড্রি নেমচেঙ্কো

5
"[\\s,]+"কমা দ্বারা পৃথক টোকেনের অভ্যন্তরীণ স্থানগুলিতেও বিভক্ত হবে, কমাটি উপস্থিত না করে, কমা ছাড়াও আশেপাশের যে কোনও শ্বেত স্পেসের পরিবর্তে এটি কমা উপস্থিত না থাকলেও উভয় সাদা স্থানকে একটি ডিলিমিটার হিসাবে বিবেচনা করবে। "\\s*(,\\s*)+"কেবলমাত্র কমা দ্বারা পৃথক করা টোকেনের চারপাশে সাদা স্পেসটি ছাঁটাই করবে এবং এমন কোনও স্ট্রিং উপেক্ষা করবে যা কেবল শ্বেতস্থান বা খালি।
theferrit32

2
পার্শ্ব নোট হিসাবে: আপনি যদি খালি ইনপুট স্ট্রিংয়ের ক্ষেত্রে একটি খালি তালিকা পাওয়ার আশা করেন, তবে এই পদ্ধতিটি আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত নয় not খালি স্ট্রিং সহ 1 টি উপাদান সহ আপনি একটি তালিকা পাবেন।
ম্যাডিস পুকনেন

3
@ অ্যালেক্সআর যদিও আপনি প্রশংসা করেছেন যে আপনি ওপিকে সম্মান করেন তবে আমি এই ধরনের কথা বলা থেকে বিরত থাকব। আমি এমন লোকদের জানি যারা মিথ্যা প্রশংসা করার সময় মানুষের প্রত্যাশা পূরণ না করাকে খারাপ বলে মনে হয়। শুধু একটি ভাবনা.

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এটিতে আপনাকে অদ্ভুত আচরণের চেয়ে কম অদ্ভুত আচরণের পাশাপাশি আপনাকে রেইগেক্স দ্বারা বিভক্ত করার প্রয়োজন হয় না (এটি কেবলমাত্র একটি বিকল্প)।


6
স্প্লিটার.অন (",") পছন্দ করতেন tri ট্রিমারসাল্টস ()। বিভক্ত (স্ট্রিং) যদিও আমি দেখতে পেয়েছি আপনি এটি উল্লেখ করেছেন। সুতরাং +1
জন বি

10
অ্যারে.এএসলিস্ট কোনও সাধারণ তালিকা ফেরত দেয় না তা নির্দেশ করার জন্য +1। আপনি যদি সেই তালিকায় / থেকে কোনও উপাদান যুক্ত বা সরিয়ে দেওয়ার চেষ্টা করেন তবে আপনি একটি অসমর্থিত অপারেশন এক্সেক্সশন পাবেন।
আলফ্রেডো ওসোরিও

9
পেয়ারাতে এখন এটি রয়েছে (15.0): স্প্লিটার.অন (",") split স্প্লিটটোলিস্ট (স্ট্রিং) । একটি ছোট পদক্ষেপ সংরক্ষণ করে।
কঙ্গো_ভি

স্ট্রিং আইকেতে খালি মান যুক্ত করার কোনও উপায় আছে যদি আমি স্ট্রিং এর মতো করে থাকি: 1, 3,3,5 এখানে 2 নিখোঁজ / খালি রয়েছে। তালিকা 2 রূপান্তর যখন এড়িয়ে যাবে। তবে আমি এটিকে খালি মূল্য হিসাবে যুক্ত করতে চাই।
এ.আলেম 11

এই বাস্তবায়ন এবং অন্যান্য কিছু অনুরূপ উদাহরণগুলির সাথে সমস্যাটি হ'ল যদিও Arrays.asListসরবরাহগুলি দেশীয় অ্যারের চারপাশে একটি মোড়ক সরবরাহ করে (একটি উপাদান অনুলিপি এড়ানো), তবুও new ArrayList(...)উপাদান অনুলিপি দ্বারা ঠিক এমন উপাদানটি করবে। আমাদের সম্ভবত এমন একটি পদ্ধতির পছন্দ করা উচিত যা পার্সযুক্ত উপাদানগুলিকে সরাসরি পছন্দসই লক্ষ্য সংগ্রহে যুক্ত করতে দেয়।
YoYo

70

দুটি পদক্ষেপ:

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

1
আপনি একবার আইটেমগুলি পরিবর্তনশীল ইনলাইন করে নিলে, এটি মূলত অন্যান্য উত্তরগুলির মতো হয় তবে বাস্তবে এটি রেজেক্স ব্যবহার না করে কিছুটা দক্ষ। ফ্লিপ দিকে, কমা এর চারপাশের ফাঁকা স্থানগুলি এই বিকল্পটিকে হত্যা করবে।
অমরিন্দর অরোরা

2
@ আমরিন্দর অরোরা যুক্তিটি splitএকটি রেজিএক্স হিসাবে ব্যাখ্যা করা হয়েছে।
ম্যাডব্রেকস

23

CSV কে অ্যারেলিস্টে রূপান্তর করার জন্য এখানে আরেকটি রয়েছে:

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 স্ট্রিম ব্যবহার করে বিকল্পগুলি সরবরাহ করতে চাই , এটি যদি আরও প্রক্রিয়াজাতকরণের জন্য পাইপলাইনের অংশ হয় তবে আপনাকে আরও বেশি সুবিধা দেবে।

.স্প্লিট ফাংশন (একটি নেটিভ অ্যারে) এর ফলাফলটিকে একটি স্ট্রিমে মোড়ানো এবং তারপরে একটি তালিকায় রূপান্তর করে।

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));

বা রেজিএক্স পার্সিং এপিআই ব্যবহার করে:

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

আপনি স্ট্রিংটি বিভক্ত করতে পেয়ারা ব্যবহার করতে পারেন এবং এটিকে অ্যারেলিস্টে রূপান্তর করতে পারেন। এটি খালি স্ট্রিংয়ের পাশাপাশি কাজ করে এবং একটি খালি তালিকা দেয়।

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
আপনি মধ্যস্থতাকারী অ্যারে.এএসলিস্টকে এড়িয়ে গেছেন। দুর্ভাগ্যক্রমে আমাদের কাছে অ্যারে উপাদানগুলির সংগ্রহ থেকে অনুলিপি রয়েছে। মনে রাখার জন্য দুর্দান্ত বিকল্প।
YoYo

4

জাভা 8 এ স্ট্রিমগুলি ব্যবহার করে এটি সমাধান করার অনেকগুলি উপায় রয়েছে তবে নীচের এক লাইনার আইএমও সরাসরি এগিয়ে রয়েছে:

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());

কেউ কি জানেন যে আমি কীভাবে এই স্ট্রিংকে কমা বিভক্ত তালিকায় রূপান্তর করতে পারি - স্ট্রিং s = "2017-07-12 23: 40: 00.0,153.76,16.140,60.00," 56.00, "; তালিকা <স্ট্রিং> বিভক্ত স্ট্রিং = নতুন অ্যারেলিস্ট <স্ট্রিং> (অ্যারে.এএসলিস্ট (এস। স্প্লিট ("\\ এস *, \\ এস *")));
সানি

1
এটি একটি নতুন প্রশ্ন, মন্তব্য হিসাবে এটি জিজ্ঞাসা করবেন না। একটি নতুন প্রশ্ন তৈরি করতে নির্দ্বিধায়।
জর্জ সিগগ্রোগলৌ

2

আপনি প্রথমে এগুলি ব্যবহার করে বিভক্ত করতে পারেন String.split(",")এবং তারপরে ফিরে আসা স্ট্রিংটিকে arrayএকটি ArrayListব্যবহারে রূপান্তর করতে পারেনArrays.asList(array)


2

গ্রোভিতে আপনি টোকেনাইজ (চরিত্রের টোকেন) পদ্ধতিটি ব্যবহার করতে পারেন:

list = str.tokenize(',')

এই আমাকে বাঁচায়! ধন্যবাদ.
tamerlaha

2

একই ফলস্বরূপ আপনি বিভাজন ক্লাস ব্যবহার করে অর্জন করতে পারেন।

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

(কোটলিনে লিখিত)


1
ডকুমেন্টেশন বলছে যে এই ফাংশনটি বিটা এবং অস্থির।
রাবারডুক্কার


1

আমি সাধারণত তালিকার জন্য পূর্বনির্ধারিত প্যাটার্ন ব্যবহার করি। এবং এটি সামান্য আরও সার্বজনীন যেহেতু এটি বন্ধনী বিবেচনা করতে পারে যা তালিকার কিছু স্ট্রিং এক্সপ্রেশন অনুসরণ করে।

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

কোটলিনে যদি আপনার স্ট্রিংয়ের তালিকাটি এর মতো হয় এবং আপনি স্ট্রিংটিকে অ্যারেলিস্টে রূপান্তর করতে ব্যবহার করতে পারেন তবে এই লাইন কোডটি ব্যবহার করুন

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 এ বিভক্ত হিসাবে রূপান্তর করুন

তালিকার অফ স্ট্রিং অবজেক্টে ["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। আমি সম্পাদনাগুলি প্রথম পুনর্বিবেচনায় ফিরিয়েছিলাম (যাতে আপনি এটি দেখতে পারেন) এবং প্রথম সংশোধনটির বিন্যাসকে আরও উন্নত করেছি।
দুর

প্রশ্নটি হল অ্যারেলিস্টে স্ট্রিং কীভাবে রূপান্তর করা যায়, অ্যারেলিস্টকে অ্যারেতে কীভাবে রূপান্তর করা যায় না।
কমরেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.