তালিকাটি <ইন্টেজার> <স্ট্রিং> এ রূপান্তর করা হচ্ছে


105

আমার পূর্ণসংখ্যার একটি তালিকা রয়েছে List<Integer>এবং আমি সমস্ত পূর্ণসংখ্যার অবজেক্টগুলিকে স্ট্রিংগুলিতে রূপান্তর করতে চাই, এইভাবে একটি নতুন দিয়ে শেষ করব List<String>

স্বাভাবিকভাবেই, আমি প্রতিটি সংখ্যার জন্য List<String>কল করে তালিকার মাধ্যমে একটি নতুন এবং লুপ তৈরি করতে পারতাম String.valueOf(), তবে আমি ভাবছিলাম যে এটি করার আরও ভাল (পড়ুন: আরও স্বয়ংক্রিয় ) উপায় আছে কিনা?

উত্তর:


77

যতদূর আমি জানি, পুনরাবৃত্তি এবং তাত্ক্ষণিক হ'ল এটি করার একমাত্র উপায়। এর মতো কিছু (অন্যের সম্ভাব্য সহায়তার জন্য, যেহেতু আমি নিশ্চিত যে আপনি কীভাবে এটি করবেন তা জানেন):

List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<>(oldList.size());
for (Integer myInt : oldList) { 
  newList.add(String.valueOf(myInt)); 
}

এটি সহজ হলে এটিকে সৌন্দর্য বলা হয়।
এলব্যাক

1
মূল পোস্টারটি ইঙ্গিত দিয়েছিল যে তিনি এটি ভেবেছিলেন তবে এই সমাধানটিকে খুব জটিল বা ক্লান্তিকর বলে মনে করেছিলেন। তবে এর থেকে সহজ আর কী হতে পারে তা ভাবতে আমি কঠোর চাপ দিয়েছি। হ্যাঁ, কখনও কখনও কোনও কাজ পেতে আপনাকে 3 বা 4 লাইন কোড লিখতে হবে।
জয়

তবে এটি আপনাকে অ্যারেলিস্টে আবদ্ধ করে। এটি কি মূল তালিকা হিসাবে একই বাস্তবায়ন ব্যবহার করে করা যেতে পারে?
alianos-

@ অ্যান্ড্রেয়াস ওল্ডলিস্ট.জেটক্লাস ()। নতুনআইন্সটেন্স () করবে
মার্টিনেজ

96

ব্যবহার পেয়ারা-প্রকল্প থেকে Google সংগ্রহগুলি , আপনি ব্যবহার করতে পারে transformপদ্ধতি তালিকাসমূহ বর্গ

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

List<Integer> integers = Arrays.asList(1, 2, 3, 4);

List<String> strings = Lists.transform(integers, Functions.toStringFunction());

Listফিরে দ্বারা transformএকটি হল দৃশ্য ব্যাকিং তালিকায় - রূপান্তর রুপান্তরিত লিস্টে প্রতিটি অ্যাক্সেস প্রয়োগ করা হবে।

Functions.toStringFunction()নালকে NullPointerExceptionপ্রয়োগ করার সময় এটি নিক্ষেপ করবে সে বিষয়ে সচেতন থাকুন , সুতরাং আপনার তালিকায় নাল থাকবে না তা নিশ্চিত হলেই এটি ব্যবহার করুন।



1
পরিষ্কার তবে খুব দ্রুত নয় .. মূল্য অনুসারে 1 টি অতিরিক্ত ফাংশন কল?
এইচ 3 এক্সস্ট্রিম

3
হটস্পট ফাংশন কলগুলিকে ইনলাইন করতে পারে - সুতরাং যদি এটি যথেষ্ট পরিমাণে বলা হয় তবে এটি কোনও পার্থক্য করা উচিত নয়।
বেন লিংস

3
আমি এটিকে নিম্নোক্ত করি না কারণ এটি সত্যই একটি সমাধান। তবে এই জাতীয় সহজ কাজটি সমাধান করার জন্য লোককে একটি লাইব্রেরি নির্ভরতা যুক্ত করতে উত্সাহিত করা আমার পক্ষে অবধারিত।
এস্তানি

1
আপনি যদি ইতিমধ্যে আমাদের দ্রব্যে পেয়ারা ব্যবহার করেন তবে খুব ভাল সমাধান।
দুদিনহা-দেদালুস

86

জাভার জন্য সমাধান ৮. পেয়ারা থেকে কিছুটা দীর্ঘ, তবে কমপক্ষে আপনাকে কোনও লাইব্রেরি ইনস্টল করতে হবে না।

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

//...

List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = integers.stream().map(Object::toString)
                                        .collect(Collectors.toList());

1
toStringউদাহরণস্বরূপ এটি কিছুটা দীর্ঘ হলেও , এটি পেয়ারা ফাংশন লাইব্রেরি দ্বারা সমর্থিত নয় এমন রূপান্তরগুলির জন্য খাটো হয়ে যায় up কাস্টম ফাংশনগুলি এখনও সহজ, তবে এটি জাভা 8 স্ট্রিমের পরে উল্লেখযোগ্যভাবে আরও কোড
লাইটউইচ05

40

আপনি যা করছেন তা ঠিক আছে তবে আপনি যদি 'জাভা-এটি-আপ' করার প্রয়োজন বোধ করেন তবে আপনি অ্যাপাচি কমন্স থেকে ট্রান্সফর্মার এবং সংগ্রহের পদ্ধতি ব্যবহার করতে পারেন , যেমন:

public class IntegerToStringTransformer implements Transformer<Integer, String> {
   public String transform(final Integer i) {
      return (i == null ? null : i.toString());
   }
}

..এবং তারপর..

CollectionUtils.collect(
   collectionOfIntegers, 
   new IntegerToStringTransformer(), 
   newCollectionOfStrings);

1
কালেকশনUtils.collect (সংগ্রহঅফিন্টিজার্স, নতুন org.apache.commons.collections.functors.StringValueTransformer ()); তবে, স্ট্রিংভ্যালু ট্রান্সফর্মার স্ট্রিং.ওয়ালুওফ ব্যবহার করে ...
কান্নান একনাথ

5
অ্যাপাচি সংগ্রহের ক্ষেত্রে যদি নতুন কোনও কাজ না করা হয় তবে তারা জেনেরিকগুলি করে না।
কিটসুনওয়াইএমজি

1
এটি আসলে জাভা-ইন-এটি ডাউন। এটি আইডেম্যাটিক জাভা নয় এবং আরও অনেকগুলি ফাংশনাল প্রোগ্রামিংয়ের মতো। আমরা যখন জাভা 8 এ ক্লোজার পাই তখন আপনি কি এটিকে idiomatic Java বলতে পারেন?
ক্রিস্টোফার হামারস্ট্রিম

জেনেরিক্সের সমর্থনের জন্য আপনি অবশ্যই সংগ্রহশালা 4 ব্যবহার করতে চান (পুরানো 3.x সংগ্রহ নয়): commons.apache.org/proper/commons-collections/apidocs/org/…
JRA_TLL

নতুন ক্লাসটিকে কেবল "আরও ওওপি বা আইডিয়োমেটিক" হিসাবে সংজ্ঞায়িত করা হচ্ছে ... প্রতিটি লুপের জন্য এটি কীভাবে ভাল তা আমি দেখতে পাচ্ছি না। এর জন্য আরও কোড প্রয়োজন এবং কার্যকারিতা দূরে সরিয়ে দেয় (যা বেনাম শ্রেণীর দ্বারা প্রশমিত করা যেতে পারে তবে এখনও)। এই কার্যকরী শৈলীটি কেবল তখন কার্যকর হতে শুরু করে যখন কোনও কার্যকর বাক্য গঠন (যেমন জাভা 8-এর পর ল্যাম্বদা এক্সপ্রেশন) যেমন কার্যকরী ভাষাগুলি যুগ যুগ ধরে এটি সরবরাহ করে।
থিওপরেটর 21

9

স্ট্রিং.ভ্যালুওফের উত্সটি এটি দেখায়:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

এটি যে খুব বেশি গুরুত্বপূর্ণ তা নয়, তবে আমি টু স্ট্রিং ব্যবহার করব।


9

স্ট্রিং.ভালিউটি ব্যবহার না করে আমি .toString () ব্যবহার করতাম; এটি @ জননাথন হোল্যান্ড বর্ণিত কিছু অটো বক্সিং এড়িয়ে চলে

জাভাডোক বলেছেন যে মান ওফ একই জিনিসটিকে ইন্টিজার. টোস্ট্রিং () হিসাবে ফেরত দেয়।

List<Integer> oldList = ...
List<String> newList = new ArrayList<String>(oldList.size());

for (Integer myInt : oldList) { 
  newList.add(myInt.toString()); 
}

'বিজয়ী' উত্তরে টম হাটিনের নির্দেশ অনুসারে, কেউ << স্ট্রিং> তালিকাই দিতে পারে না কারণ এটি কেবল একটি ইন্টারফেস।
স্টু থম্পসন

হেই আমি জানতাম। আমি কোডটি চেষ্টা না করে লিখেছি। আমি আমার উত্তরে এটি ঠিক করব।
ScArcher2

9

নন-জেডি কে লাইব্রেরি দিয়ে প্রতারণা না করেই এখানে একটি ওয়ান-লাইনারের সমাধান রয়েছে।

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));

7

পেয়ারা এবং জাভা 8 ব্যবহার করে আরেকটি সমাধান

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));

3

মূল জাভা নয়, এবং জেনেরিক-আইয়েড নয়, তবে জনপ্রিয় জাকার্তা কমন্স সংগ্রহের পাঠাগারটিতে এই ধরণের কাজের জন্য কিছু দরকারী বিমূর্ততা রয়েছে। বিশেষত, সংগ্রহের পদ্ধতিগুলি একবার দেখুন

CollectionUtils

আপনি যদি ইতিমধ্যে আপনার প্রকল্পে কমন্স সংগ্রহ ব্যবহার করছেন তবে কিছু বিবেচনার জন্য।


4
অ্যাপাচি সংগ্রহগুলি কখনই ব্যবহার করবেন না। এগুলি পুরানো, পুরানো, টাইপ-নিরাপদ নয় এবং খারাপ লেখা রয়েছে।
কিটসুনওয়াইএমজি

3

জাস্টাইটের উত্তরে "বক্সিং" সম্পর্কে উদ্বিগ্ন লোকদের কাছে: এখানে কিছুই নেই। String.valueOf(Object)এখানে ব্যবহৃত হয়, এবং কোনও আনবক্সিং intকখনও করা হয় না।

আপনি কীভাবে ব্যবহার করতে পারবেন Integer.toString()বা String.valueOf(Object)নির্ভর করে আপনি কীভাবে সম্ভব নাল পরিচালনা করতে চান। আপনি কি একটি ব্যতিক্রম (সম্ভবত) নিক্ষেপ করতে চান, বা আপনার তালিকায় "নাল" স্ট্রিংগুলি রাখতে পারেন (সম্ভবত)। যদি প্রাক্তন হয়, আপনি একটি NullPointerExceptionবা অন্য কিছু টাইপ নিক্ষেপ করতে চান ?

এছাড়াও, জাস্টাইটের প্রতিক্রিয়াতে একটি ছোট ত্রুটি: Listএকটি ইন্টারফেস, আপনি এটিতে নতুন অপারেটরটি ব্যবহার করতে পারবেন না। আমি সম্ভবত java.util.ArrayListএই ক্ষেত্রে একটি ব্যবহার করব , বিশেষত যেহেতু আমরা জানি যে তালিকাটি কত দীর্ঘ হতে পারে।



2

@ জোনাথন: আমার ভুল হতে পারে তবে আমি বিশ্বাস করি যে এই ক্ষেত্রে স্ট্রিং.ভ্যালুওফ () স্ট্রিং.ভ্যালুওফ (অবজেক্ট) ফাংশনটিকে স্ট্রিং.ভ্যালুওফ (ইনট্রি) তে বক্স না করে কল করবে। স্ট্রিং.ভেলুওফ (অবজেক্ট) কেবল "নাল" ফেরত দেয় যদি এটি নাল হয় বা অবজেক্ট.টোস্ট্রিং () যদি নন-নুল হয় তবে এতে বক্সিং জড়িত থাকা উচিত নয় (যদিও স্পষ্টতই নতুন স্ট্রিং অবজেক্ট জড়িত রয়েছে)।


2

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

বক্সিং / আনবক্সিং প্রক্রিয়া দ্বারা সৃষ্ট পারফরম্যান্স সমস্যা সম্পর্কেও চিন্তা করবেন না। যদি পারফরম্যান্স সমালোচনা হয় তবে কেবল একটি অ্যারে ব্যবহার করুন। যদি এটি সত্যিই সমালোচিত হয় তবে জাভা ব্যবহার করবেন না। জেভিএমকে আউটস্মার্ট করার চেষ্টা কেবলমাত্র ব্যথার দিকে পরিচালিত করে।


2

শুধুমাত্র বিশেষজ্ঞদের জন্য একটি উত্তর:

    List<Integer> ints = ...;
    String all = new ArrayList<Integer>(ints).toString();
    String[] split = all.substring(1, all.length()-1).split(", ");
    List<String> strs = Arrays.asList(split);

এটি কাজ করে কিন্তু অদক্ষতা ব্যয় করে। জাভা স্ট্রিংস প্রতি চর প্রতি দুটি বাইট হয়, সুতরাং "," পূর্ণসংখ্যার নিজেই গণনা করার আগে পূর্ণসংখ্যা হিসাবে একটি চার বাইট নির্ধারিত ব্যয় যুক্ত করে .... অন্যান্য জিনিসের মধ্যে।
রবার্ট ক্রিশ্চিয়ান

আমি মনে করি কাঁচা সিপিইউ চক্র দক্ষতার দিক থেকে রেজেক্স আরও সমস্যা হতে পারে। মেমরির ক্ষেত্রে, আমি অনুমান করি যে একটি যুক্তিসঙ্গত বাস্তবায়ন ("সূর্যের" অযৌক্তিক বাস্তবায়ন অনুমান করে String) একই ব্যাকিং অ্যারে ভাগ করে নেবে (থেকে all), সুতরাং এটি সত্যই যথেষ্ট মেমরি দক্ষ হবে, যা দীর্ঘমেয়াদী কর্মক্ষমতা জন্য গুরুত্বপূর্ণ। যদি না আপনি কেবল একটি উপাদান অবশ্যই রাখতে চান ...
টম হাটিন -

2

লাম্বডাজ খুব সহজ এবং পঠনযোগ্য উপায়ে এটি করতে দেয়। উদাহরণস্বরূপ, ধরুন আপনার কাছে পূর্ণসংখ্যার একটি তালিকা রয়েছে এবং আপনি সেগুলি সম্পর্কিত স্ট্রিং উপস্থাপনায় রূপান্তর করতে চান আপনি এর মতো কিছু লিখতে পারেন;

List<Integer> ints = asList(1, 2, 3, 4);
Iterator<String> stringIterator = convertIterator(ints, new Converter<Integer, String> {
    public String convert(Integer i) { return Integer.toString(i); }
}

লম্বডাজ কেবলমাত্র যখন আপনি ফলাফলটিতে পুনরাবৃত্তি করছেন তখনই রূপান্তর ফাংশনটি প্রয়োগ করে।


1

আপনি "বক্সিং ওভারহেড" এড়াতে পারবেন না; জাভার ফ্যাক্স জেনেরিক পাত্রে কেবলমাত্র অবজেক্টগুলি সঞ্চয় করা যায়, তাই আপনার ints অবশ্যই পূর্ণসংখ্যায় বাক্সে রাখা উচিত। নীতিগতভাবে এটি অবজেক্ট থেকে পূর্ণসংখ্যার অবনমন এড়াতে পারে (যেহেতু এটি অর্থহীন, কারণ অবজেক্ট স্ট্রিং.ভ্যালুওফ এবং অবজেক্ট.টোস্ট্রিং উভয়ের পক্ষে যথেষ্ট) তবে আমি জানি না যে সংকলক এটি করতে যথেষ্ট স্মার্ট কিনা। স্ট্রিং থেকে অবজেক্টে রূপান্তরটি কম-বেশি কোনও অপশন হওয়া উচিত, সুতরাং আমি সে সম্পর্কে উদ্বিগ্ন হতে চাই।


সংকলক এটি করতে যথেষ্ট স্মার্ট নয়। জাভাক চললে, এটি আসলে সমস্ত জেনেরিক প্রকারের তথ্য সরিয়ে দেয়। জেনেরিক সংগ্রহের অন্তর্নিহিত বাস্তবায়ন সর্বদা অবজেক্ট রেফারেন্স সঞ্চয় করে। আপনি আসলে <T> প্যারামিট্রাইজেশন বাদ দিতে পারেন এবং একটি "কাঁচা" টাইপ পেতে পারেন। "তালিকা l = নতুন তালিকা ()" বনাম "তালিকা <স্ট্রিং> l = নতুন তালিকা <স্ট্রিং> ()"। অবশ্যই, এর অর্থ হ'ল "তালিকা <স্ট্রিং> l = (তালিকা <স্ট্রিং>) নতুন তালিকা <Integer> ()" আসলে সংকলন এবং চালিত হবে, তবে এটি অবশ্যই খুব বিপজ্জনক।
ডেভ ডপসন

1

আমি এমন কোনও সমাধান দেখিনি যা মহাকাশ জটিলতার প্রধানটিকে অনুসরণ করে। পূর্ণসংখ্যার তালিকায় যদি বিপুল পরিমাণে উপাদান থাকে তবে এটি বড় সমস্যা।

It will be really good to remove the integer from the List<Integer> and free
the space, once it's added to List<String>.

আমরা এটি অর্জন করতে পুনরুক্তি ব্যবহার করতে পারি।

    List<Integer> oldList = new ArrayList<>();
    oldList.add(12);
    oldList.add(14);
    .......
    .......

    List<String> newList = new ArrayList<String>(oldList.size());
    Iterator<Integer> itr = oldList.iterator();
    while(itr.hasNext()){
        newList.add(itr.next().toString());
        itr.remove();
    }

1

স্ট্রিম ব্যবহার করে: যদি বলি ফলাফলটি পূর্ণসংখ্যা ( List<Integer> result) এর তালিকা হয় তবে:

List<String> ids = (List<String>) result.stream().map(intNumber -> Integer.toString(intNumber)).collect(Collectors.toList());

এটি সমাধানের অন্যতম উপায়। আশাকরি এটা সাহায্য করবে.


1

মূল তালিকার forEach পদ্ধতি ব্যবহার করে কিছুটা আরও সংক্ষিপ্ত সমাধান:

    List<Integer> oldList = Arrays.asList(1, 2, 3, 4, 5);
    List<String> newList = new ArrayList<>(oldList.size());
    oldList.forEach(e -> newList.add(String.valueOf(e)));

0

শুধু মজাদার জন্য, jsr166y কাঁটাচামচ ফ্রেমওয়ার্ক ব্যবহার করে এমন একটি সমাধান যা জেডিকে in তে হওয়া উচিত।

import java.util.concurrent.forkjoin.*;

private final ForkJoinExecutor executor = new ForkJoinPool();
...
List<Integer> ints = ...;
List<String> strs =
    ParallelArray.create(ints.size(), Integer.class, executor)
    .withMapping(new Ops.Op<Integer,String>() { public String op(Integer i) {
        return String.valueOf(i);
    }})
    .all()
    .asList();

(অস্বীকৃতি: সংকলন করা হয়নি। স্পেস চূড়ান্ত হয়নি t ইত্যাদি)

ম্যাপিং কলটি কম ভার্বোস সহ এটি তৈরি করতে জেডিকে in তে থাকা কিছুটা প্রকারের অনুমিতি এবং সিনট্যাকটিকাল চিনি like

    .withMapping(#(Integer i) String.valueOf(i))

0

এটি করার মতো এটি একটি বেসিক জিনিস আমি কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করব না (এটি আপনার প্রকল্পে নির্ভরতার কারণ হবে যা আপনার সম্ভবত প্রয়োজন নেই)।

এই ধরণের কাজগুলি করার জন্য আমাদের বিশেষভাবে তৈরি একটি স্ট্যাটিক পদ্ধতি রয়েছে। কারণ এর কোডটি এত সহজ we আমরা হটস্পটকে আমাদের জন্য অপ্টিমাইজেশনটি করি। এটি আমার কোডটিতে সম্প্রতি থিম বলে মনে হচ্ছে: খুব সাধারণ (সোজা) কোডটি লিখুন এবং হটস্পটকে এর যাদু করতে দিন। আমাদের মতো কোডের চারপাশে পারফরম্যান্সের সমস্যা খুব কমই থাকে - যখন একটি নতুন ভিএম সংস্করণ বরাবর আসে আপনি সমস্ত অতিরিক্ত গতির সুবিধা ইত্যাদি পান etc.

আমি যতই জাকার্তা সংগ্রহগুলি পছন্দ করি, তারা জেনারিক্সকে সমর্থন করে না এবং এলসিডি হিসাবে 1.4 ব্যবহার করে না। আমি গুগল সংগ্রহগুলি সম্পর্কে সতর্ক থাকি কারণ এগুলি আলফা সমর্থন স্তর হিসাবে তালিকাভুক্ত!


-1

আমি কেবল সমস্যার একটি অবজেক্ট ওরিয়েন্টেড সমাধানের সাথে আঁকতে চেয়েছিলাম।

আপনি যদি ডোমেন অবজেক্টগুলিকে মডেল করেন, তবে সমাধানটি ডোমেন অবজেক্টে রয়েছে। এখানে ডোমেনটি পূর্ণসংখ্যার একটি তালিকা যার জন্য আমরা স্ট্রিংয়ের মান চাই।

সবচেয়ে সহজ উপায় হ'ল তালিকাটি একেবারে রূপান্তর না করা।

বলা হচ্ছে, রূপান্তর না করে রূপান্তর করতে, পূর্ণসংখ্যার মূল তালিকাটিকে মানের তালিকায় পরিবর্তন করুন, যেখানে মানটি দেখতে এমন কিছু দেখাচ্ছে ...

class Value {
    Integer value;
    public Integer getInt()
    {
       return value;
    }
    public String getString()
    {
       return String.valueOf(value);
    }
}

এটি দ্রুত হবে এবং তালিকাটি অনুলিপি করার চেয়ে কম স্মৃতি গ্রহণ করবে।

শুভকামনা!

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