জাভাতে কোনও স্ট্রিং পুনরাবৃত্তি করার সহজ উপায়


597

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

String str = "abc";
String repeated = str.repeat(3);

repeated.equals("abcabcabc");

সম্পর্কিত:

পুনরাবৃত্ত স্ট্রিং জাভাস্ক্রিপ্ট অন্য স্ট্রিংকে প্রদত্ত সংখ্যার বার বার করে NSString তৈরি করুন

সম্পাদিত

লুপগুলি যখন সম্পূর্ণরূপে প্রয়োজনীয় না হয় তখন আমি এড়াতে চেষ্টা করি কারণ:

  1. তারা কোডের লাইনগুলির সংখ্যায় যুক্ত করে এমনকি অন্য কোনও ফাংশনে টিক দেওয়া হলেও।

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

  3. প্রোগ্রামাররা লুপের জন্য চতুর জিনিসগুলি রাখতে পছন্দ করে, এমনকি যদি আমি এটি "কেবল যা করতে ইচ্ছা করি তা করতে" লিখি, এটি কারও সাথে আসা এবং কিছু অতিরিক্ত চৌকস "সংশোধন" যুক্ত করা থেকে বিরত থাকে না।

  4. এগুলি খুব সহজেই ভুল হওয়া সহজ। সূচকের সাথে জড়িত লুপগুলির জন্য একটি বাগ দ্বারা উত্পন্ন হয়।

  5. লুপগুলির জন্য প্রায়শই একই ভেরিয়েবলগুলি পুনরায় ব্যবহার করে স্কোপিং বাগগুলি খুঁজে পাওয়া সত্যিই শক্তির সম্ভাবনা বাড়িয়ে তোলে।

  6. লুপগুলির জন্য বাগ শিকারী যে জায়গাগুলি দেখতে হবে সেগুলি সংখ্যা বাড়িয়ে দেয়।


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

9
"তারা কোডের লাইনগুলির সংখ্যায় যুক্ত করে এমনকি তাদের অন্য কোনও কার্যক্রমে টিক দেওয়া হলেও" ... বাহ, কেবল বাহ! বিগ-ও, এলওসি নয়
পাইরোলিস্টিকাল

7
@ আইমাজিস্ট আমি এমন পরিস্থিতিতে লুপগুলি এড়াচ্ছি যেখানে এটি আমার পড়ার যোগ্যতা এবং রক্ষণাবেক্ষণের জন্য ব্যয় করে। আমি এখানে গতিকে ন্যূনতম গুরুত্বপূর্ণ সমস্যা হিসাবে বিবেচনা করি (বাস্তবে এটি একটি নন-ইস্যু)। আমি মনে করি লুপগুলির জন্য অতিরিক্ত ব্যবহার করা হয়নি এবং লুপগুলি যখন প্রয়োজন হয় তখনই কেবল সেগুলি ব্যবহার করতে শিখতে চেষ্টা করব এবং এটি কোনও ডিফল্ট সমাধান হিসাবে নয়।
ইথান হেলম্যান

3
@ পাইরোলিস্টিকাল আমি পারফরম্যান্স বা অ্যাসিম্পটিক সুবিধার দাবি করছি না not বরং কম কোড লিখে, এবং চাকা পুনরায় উদ্ভাবনের চেয়ে গ্রন্থাগার ফাংশন ব্যবহার করে আমি পঠনযোগ্যতা বাড়ানোর সময় বাগের পৃষ্ঠের অঞ্চল (কোডের লাইন) হ্রাস করি। উভয় ভাল জিনিস আমি নিশ্চিত আপনি সম্মত হন।
ইথান হেলম্যান

4
@ e5; বছর পরে পোস্ট করার জন্য দুঃখিত। আমি এই প্রশ্নটি এতটা উপযুক্ত বলে মনে করি। যদি কোনও পদ্ধতিতে sertedোকানো হয় তবে আর্গুমেন্টগুলি পরীক্ষা করা উচিত (বার> = 0), ত্রুটি নিক্ষেপ করা ইত্যাদি hisএটি দৃ rob়তা যোগ করে তবে পড়তে কোডের লাইনও। একটি স্ট্রিং পুনরাবৃত্তি করা দ্ব্যর্থহীন কিছু W কোডটি পড়লে স্ট্রিং.রেপিয়েট ঠিক কী করে তা জানে, এমনকি কোনও মন্তব্য বা জাভাদোকের রেখা ছাড়াই I আমরা যদি একটি স্থিত লাইব্রেরি ব্যবহার করি তবে যুক্তিযুক্ত যে এতো সাধারণ ফাংশনটিতে কোনও বাগ নেই, YET "দৃ "়তা" যাচাইয়ের কিছু ফর্ম প্রবর্তন করে যা আমাদের এমনকি চিন্তা করা দরকার need আমি যদি 10 টি উন্নতি জিজ্ঞাসা করতে পারি তবে এই (ধরণের) জিনিসগুলি এক হবে।
অ্যাগ্রোস্টিনাক্স

উত্তর:


229

String::repeat

". ".repeat( 7 )  // Seven period-with-space pairs: . . . . . . . 

জাভা ১১-এ নতুন হ'ল এমন একটি পদ্ধতি String::repeatযা আপনি যা চেয়েছিলেন ঠিক তা করে:

String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");

এর জাভাদোক বলেছেন:

/**
 * Returns a string whose value is the concatenation of this
 * string repeated {@code count} times.
 * <p>
 * If this string is empty or count is zero then the empty
 * string is returned.
 *
 * @param count number of times to repeat
 *
 * @return A string composed of this string repeated
 * {@code count} times or the empty string if this
 * string is empty or count is zero
 *
 * @throws IllegalArgumentException if the {@code count} is
 * negative.
 *
 * @since 11
 */ 

2
@ নিকোলাই এর উত্স কোড, ঠিক যদি কেউ hg.openjdk.java.net/jdk/jdk/file/fc16b5f193c7/src/java.base/…
ইউজিন

7
আমি জাভা 9 এখনও রাস্তায় দেখিনি (এবং দীর্ঘকাল যাব না ..) - এবং 11 সম্ভবত
বাহিত হতে চলেছে

1
সম্ভবত সুস্পষ্ট, তবে আপনি এই পদ্ধতিটিকে "abc".repeat(3)
স্ট্রিংতে আক্ষরিকও বলতে পারেন

895

এখানে সংক্ষিপ্ততম সংস্করণ (জাভা 1.5+ প্রয়োজনীয়):

repeated = new String(new char[n]).replace("\0", s);

nআপনি স্ট্রিংটি পুনরাবৃত্তি করতে চান এমন সংখ্যাটি কোথায়s স্ট্রিং পুনরাবৃত্ত হয়।

কোন আমদানি বা গ্রন্থাগার প্রয়োজন।


22
আমি মনে করি না যে এটি মোটেও অবহেলিত। আদিম ধরণের ( char[], Stringএক্ষেত্রে ) নাল দিয়ে তাত্ক্ষণিকভাবে তৈরি করা হয়, তারপরে একটি তৈরি করা হয় char[], এবং নালগুলি replaced()আপনি যে চরিত্রটিতে চান তা দিয়ে থাকেs
Amarok

32
যদিও এটি খুব চতুর (+1) আমি মনে করি এটি বেশিরভাগ ক্ষেত্রেই সেই বিন্দুটি প্রমাণ করে যে লুপগুলি প্রায়শই পরিষ্কার কোডের জন্য করে
রিচার্ড টিংল

75
যারা আপত্তি সম্পর্কে অভিযোগ করেন, তাদের পাঠযোগ্যতা সাক্ষরতার উপর নির্ভর করে। এটি এটি কী করে তা পুরোপুরি স্পষ্ট এবং যারা এটি এখনই দেখতে পাবেন না তাদের জন্য শিক্ষামূলক। এইভাবে আপনি জাভা দিয়ে যাবেন।
ডানসালমো

11
আরও ভাল পারফরম্যান্সের ...replace('\0', str)জন্য স্ট্রিং সংস্করণের পরিবর্তে ব্যবহার করা উচিত।
ব্যবহারকারী 686249

11
@ ব্যবহারকারী 666৪৪৯: কেবলমাত্র আছে replace(char oldChar, char newChar)এবং replace(CharSequence target, CharSequence replacement)তাই এটি কীভাবে কাজ করতে পারে তা আমি দেখতে পাই না
user102008

334

আপনি যদি জাভা ব্যবহার করছেন <= 7 , এটি এটি "সংক্ষিপ্ত" হিসাবে এটি পায়:

// create a string made up of n copies of string s
String.format("%0" + n + "d", 0).replace("0", s);

ইন জাভা 8 এবং তার চাইতে বেশী একটি আরো ভালো পঠনযোগ্য উপায় নেই:

// create a string made up of n copies of string s
String.join("", Collections.nCopies(n, s));

পরিশেষে, জাভা ১১ এবং তারপরের জন্য এটির জন্য repeat​(int count)বিশেষত একটি নতুন পদ্ধতি রয়েছে ( লিঙ্ক )

"abc".repeat(12);

বিকল্পভাবে, যদি আপনার প্রকল্পটি জাভা লাইব্রেরি ব্যবহার করে তবে আরও বিকল্প রয়েছে।

জন্য অ্যাপাচি কমন্স :

StringUtils.repeat("abc", 12);

জন্য গুগল পেয়ারা :

Strings.repeat("abc", 12);

4
nশূন্য হলে প্রাক্তন ব্যতিক্রম ঘটায় ।
saka1029

জাভা 8 উদাহরণটি সংকলন করে না -> মিলটি টাইপ করুন: তালিকাটি <পরীক্ষক> থেকে চর সিকোয়েন্সে রূপান্তর করতে পারে না
অ্যারিজিয়ন

6
@ অরিজিওন sস্ট্রিং হতে হবে, একটি নয়Char
ক্যানার

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

@ অ্যারজিউন কোনও সমস্যা নেই, এটি এখন স্পষ্ট করে জানিয়ে দিয়েছেন যে এসটি একটি স্ট্রিং
ক্যানার

312

কমন্স ল্যাং স্ট্রিংইটিলস.রেপিয়াট ()

ব্যবহার:

String str = "abc";
String repeated = StringUtils.repeat(str, 3);

repeated.equals("abcabcabc");

99
দীর্ঘমেয়াদে সরলতার জন্য এক-পদ্ধতি-নির্ভরতা ব্যবহার করা জার-জাহান্নামের কারণ হতে পারে
ডিএফএ

81
অবশ্যই, এটি কমন্স ল্যাং বাদে। আমি কখনও মনে করি না যে আমি 5000 টিরও বেশি এলওএসএস-এর চেয়ে বেশি এমন একটি প্রকল্প দেখেছি যেখানে কমন্স ল্যাং নেই।
ইথান হেলম্যান

11
কমন্স ল্যাং ওপেন সোর্স - এটি ডাউনলোড করুন এবং একবার দেখুন। অবশ্যই এর ভিতরে একটি লুপ রয়েছে তবে এটি এতটা সহজ নয়। প্রচুর প্রচেষ্টা সেই বাস্তবায়নটি প্রোফাইলিং এবং অনুকূলিতকরণে চলেছিল।
ChssPly76

28
পারফরম্যান্সের কারণে আমি লুপগুলি এড়াতে পারি না (প্রশ্নটিতে আমার কারণগুলি পড়ুন)। যখন কেউ স্ট্রিংটিলস.রেপিয়ট দেখেন, তারা জানেন যে আমি কী করছি। তাদের উদ্বেগের দরকার নেই যে আমি নিজের সংস্করণের পুনরাবৃত্তি লেখার চেষ্টা করেছি এবং ভুল করেছি। এটি একটি পারমাণবিক জ্ঞানীয় ইউনিট!
ইথান হেলম্যান

7
@ থরবজর্ন রাভন অ্যান্ডারসন - বিষয়গুলি প্রসঙ্গের বাইরে
রাখলে

140

জাভা 8 এর সাথে মিলে এটি String.joinকরার একটি পরিপাটি উপায় সরবরাহ করে Collections.nCopies:

// say hello 100 times
System.out.println(String.join("", Collections.nCopies(100, "hello")));

7
ধন্যবাদ! অ্যান্ড্রয়েডের জন্য TextUtils.join () String.join () এর পরিবর্তে ব্যবহার করা যেতে পারে
MinaHany

2
এই উত্তরের জন্য আপনাকে ধন্যবাদ। এটি কোনও বাহ্যিক এপিআইডি ওডার ইউটিলিটি পদ্ধতি ব্যবহার না করেই সবচেয়ে পরিষ্কার উপায় বলে মনে হচ্ছে! খুব ভালো!!
আন্দ্রেয়াস এম ওবেরহিম

2
এই পদ্ধতির সুন্দর জিনিসটি হল যুক্ত হওয়ার সাথে সাথে আপনি একটি বিভাজক চরিত্র সরবরাহ করতে পারেন যা আপনি যদি হন তবে খুব সহজেই কাজ করে, বলুন, একটি CSV তালিকা তৈরি করছেন। অন্যান্য সমস্ত পদ্ধতির সাথে আপনার একটি সমাপ্তি যোগ দেওয়ার চরিত্র রয়েছে যা পৃথক ক্রিয়াকলাপে ছিনিয়ে নেওয়া দরকার।
DroidOS

102

কেবলমাত্র স্ট্রিং ফাংশন এবং কোনও স্পষ্ট লুপ ব্যবহার করে এটি করার একটি উপায় এখানে রয়েছে:

// create a string made up of  n  copies of  s
repeated = String.format(String.format("%%%ds", n), " ").replace(" ",s);

5
আশ্চর্যজনক :-) যদিও শূন্য হয়ে উঠতে এন থেকে সাবধান থাকুন…!
ইয়াং মায়ার

4
@ বিজয় দেব ও দুর্গ: না, তার মানে ছিল replace()। জাভা 1.5+ তে, এর ওভারলোডেড সংস্করণটি replace()দুটি CharSequenceগুলি লাগে (যার মধ্যে রয়েছে String): ডাউনলোড.
oracle.com/javase/1.5.0/docs/api/java/lang/…

79
সেকি। এটি কুৎসিত।
ক্যারেল বালেক

8
@mzuba এর কথা বলা যাক n=3বর্ণন কিছু এটা প্রথম ফরম্যাটের একটি স্ট্রিং মত: %03d( %%, যা 3 প্যাডিং শূণ্যসমূহ, তারপর ফরম্যাটের যোগ করার জন্য বিন্যাস কোড শতাংশ চিহ্ন অব্যাহতি হয়) 0যে সঙ্গে, এর নেতৃস্থানীয় 000, এবং পরিশেষে প্রতিটি প্রতিস্থাপন 0স্ট্রিং সঙ্গে
ফোরট্রান

15
উত্তর প্রদান কম কুশ্রী এবং বুঝতে সহজ করতে পারেন: String.format .replace ( "% 0" + N + + "D" 0,) ( "0", গুলি)
মধ্যে Artur

87

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

Strings.repeat("-", 60);

2
... এবং 3Mb নতুন নির্ভরতা পান।
মনোথ্রেডেড

6
@ মনো থ্রেডড আমি ভেবেছিলাম এটি না বলে চলে যাবে, তবে কেবল স্ট্রিং পুনরাবৃত্তি করার জন্য পেয়ারা অন্তর্ভুক্ত করবেন না। আমার উত্তরটি ছিল আপনি যদি ইতিমধ্যে পেয়ারা ব্যবহার করেন তবে এইভাবে আপনি এটি করতেন।
জ্যাক

53

সঙ্গে , আপনি ব্যবহার করতে পারেন Stream.generate

import static java.util.stream.Collectors.joining;
...
String repeated = Stream.generate(() -> "abc").limit(3).collect(joining()); //"abcabcabc"

এবং প্রয়োজনে আপনি এটিকে একটি সাধারণ ইউটিলিটি পদ্ধতিতে মোড়ানো করতে পারেন:

public static String repeat(String str, int times) {
   return Stream.generate(() -> str).limit(times).collect(joining());
}

6
... বা return IntStream.range(0, times).mapToObj(i -> str).collect(joining());যা আরও সমান্তরাল করে
অ্যালেক্সিস সি

32

সুতরাং আপনি লুপ এড়াতে চান?

এখানে আপনি এটি আছে:

public static String repeat(String s, int times) {
    if (times <= 0) return "";
    else return s + repeat(s, times-1);
}

(অবশ্যই আমি জানি এটি কুরুচিপূর্ণ এবং অদক্ষ, তবে এর লুপগুলি নেই :- পি)

আপনি এটি সহজ এবং সুন্দর চান? জাইথন ​​ব্যবহার করুন:

s * 3

সম্পাদনা করুন : আসুন এটি কিছুটা অপ্টিমাইজ করা যাক :-D

public static String repeat(String s, int times) {
   if (times <= 0) return "";
   else if (times % 2 == 0) return repeat(s+s, times/2);
   else return s + repeat(s+s, times/2);
}

সম্পাদনা 2 : আমি 4 টি মূল বিকল্পের জন্য একটি দ্রুত এবং নোংরা মাপদণ্ড তৈরি করেছি, তবে উপায়টি পেতে এবং বেশ কয়েকটি ইনপুটগুলির জন্য সময়টি পরিকল্পনা করার জন্য আমার এটি বেশ কয়েকবার চালানোর সময় নেই ... সুতরাং কেউ চাইলে কোডটি এখানে এটি চেষ্টা করতে:

public class Repeat {
    public static void main(String[] args)  {
        int n = Integer.parseInt(args[0]);
        String s = args[1];
        int l = s.length();
        long start, end;

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatLog2(s,i).length()!=i*l) throw new RuntimeException();
        }
        end = System.currentTimeMillis();
        System.out.println("RecLog2Concat: " + (end-start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatR(s,i).length()!=i*l) throw new RuntimeException();
        }               
        end = System.currentTimeMillis();
        System.out.println("RecLinConcat: " + (end-start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatIc(s,i).length()!=i*l) throw new RuntimeException();
        }
        end = System.currentTimeMillis();
        System.out.println("IterConcat: " + (end-start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatSb(s,i).length()!=i*l) throw new RuntimeException();
        }
        end = System.currentTimeMillis();
        System.out.println("IterStrB: " + (end-start) + "ms");
    }

    public static String repeatLog2(String s, int times) {
        if (times <= 0) {
            return "";
        }
        else if (times % 2 == 0) {
            return repeatLog2(s+s, times/2);
        }
        else {
           return s + repeatLog2(s+s, times/2);
        }
    }

    public static String repeatR(String s, int times) {
        if (times <= 0) {
            return "";
        }
        else {
            return s + repeatR(s, times-1);
        }
    }

    public static String repeatIc(String s, int times) {
        String tmp = "";
        for (int i = 0; i < times; i++) {
            tmp += s;
        }
        return tmp;
    }

    public static String repeatSb(String s, int n) {
        final StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n; i++) {
            sb.append(s);
        }
        return sb.toString();
    }
}

এটি 2 টি আর্গুমেন্ট গ্রহণ করে, প্রথমটি পুনরাবৃত্তির সংখ্যা (প্রতিটি ফাংশন 1..n থেকে পুনরাবৃত্তি বারের সাথে চালিত হয়) এবং দ্বিতীয়টি পুনরাবৃত্তি করার জন্য স্ট্রিং।

এখনও অবধি, বিভিন্ন ইনপুটগুলির সাথে চলমান সময়ের তাত্ক্ষণিক পরিদর্শনটি র‌্যাঙ্কিংয়ের মতো কিছু ফেলে দেয় (আরও ভাল থেকে খারাপ):

  1. আইট্রেটিভ স্ট্রিংবিল্ডার অ্যাপেন্ড (1x)।
  2. পুনরাবৃত্তিমূলক কনটেনটেশন লগ 2 অনুরোধ (~ 3x)।
  3. রিকার্সিভ কনটেন্টেশন লিনিয়ার ইনভোকেশনস (~ 30x)।
  4. আইট্রেটিভ কনটেন্টেশন লিনিয়ার (~ 45x)।

আমি কখনও অনুমান করতাম না যে পুনরাবৃত্তির কাজটি forলুপের চেয়ে দ্রুত ছিল : -ও

মজা করুন (ctional xD)।


1
পুনরাবৃত্তি এবং স্পষ্টতই একটি লিস্প হ্যাকার হিসাবে +1। আমি মনে করি না যে এটি এতটা অক্ষম, স্ট্রিং কনটেনটেশন এটি একবারের মতো ওয়ারক্রমে ছিল না, কারণ + সত্যই কেবল একটি স্ট্রিং বিল্ডার ইউটিএইচ। দেখুন stackoverflow.com/questions/47605/java-string-concatenation এবং schneide.wordpress.com/2009/02/23/... । আমি অবাক হই যে এই সমস্ত স্ট্যাকটি পুনরাবৃত্তি ব্যয় থেকে কতটা ধাক্কা দেয় এবং পপ হয়, বা হটস্পট যদি তাদের যত্ন নেয়। সত্যই কামনা করি আমার কাছে বেঞ্চমার্ক করার অবাধ সময় ছিল অন্য কেউ হয়তো?
ইথান হেলম্যান

@ ই 5: কেল্লান ঠিক আছে; এই সমাধান আরও দক্ষ করা যেতে পারে। এই বাস্তবায়ন অযথা প্রতিটি পুনরাবৃত্তির জন্য একটি নতুন স্ট্রিংবিল্ডার (এবং একটি নতুন স্ট্রিং) তৈরি করবে। তবুও একটি দুর্দান্ত সমাধান।
ছিনতাই করুন

3
@ E5 আমি চাই আমার একটা পাতার মর্মর হ্যাকার xD ... যদি আমি ছিল, আমি একটি লেঙ্গুড় recursive ফাংশন :-p ব্যবহার করেছেন হতো
ফোরট্রান

1
মাইক্রোবেঞ্চমার্ক জাভাতে ভাল কাজ করে না। আপনার বাস্তবায়নের গতির মতো পরিমাপ করার চেষ্টা করা ভাল নয়।
ceklock

@ টোট্রন আমি জানি, তবে তবুও তারা কিছুই চেয়ে ভাল ... এবং একমাত্র 'আশ্চর্য' ছিল নিষ্পাপ লুপ কনটেনটেশন এবং লিনিয়ার পুনরাবৃত্তির মধ্যে সামান্য পার্থক্য।
ফরট্রান

20

এটিতে আপনার প্রশ্নের চেয়ে কম অক্ষর রয়েছে

public static String repeat(String s, int n) {
    if(s == null) {
        return null;
    }
    final StringBuilder sb = new StringBuilder(s.length() * n);
    for(int i = 0; i < n; i++) {
        sb.append(s);
    }
    return sb.toString();
}

4
এতে আমার উত্তর StringUtils.repeat (str, n) এর চেয়ে বেশি অক্ষর রয়েছে।
ইথান হেলম্যান

8
আপনি যদি ইতিমধ্যে অ্যাপাচি কমন্স ব্যবহার না করেন তবে এই উত্তরটি অনেক কম ঝামেলা - এটি আপনার ক্লাসপথে অন্য কোনও লাইব্রেরি ডাউনলোড না করে, এটির লাইসেন্সটি আপনার সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করে না
পল টমলিন

7
দয়া করে কখনই নালায় ফিরে আসবেন না - সেক্ষেত্রে খালি স্ট্রিংটি ফিরিয়ে দিন, যা আপনাকে সর্বদা চেক না করে ফেরত মানটি ব্যবহার করতে দেয়। অন্যথায়, পোস্টারটি ব্যবহার করার জন্য আমি কী সুপারিশ করব।
থরবজর্ন রাভন অ্যান্ডারসন

7
হ্যাঁ, তিনটি উপায় হ্যান্ডল করার উপায় আছে যদি গুলি নাল হয়। 1. ত্রুটিটি পাস করুন (নাল রিটার্ন করুন), 2. ত্রুটিটি লুকান (রিটার্ন ""), 3. একটি এনপিই নিক্ষেপ করুন। ত্রুটিটি লুকিয়ে রাখা এবং একটি এনপিই নিক্ষেপ করা ভাল নয়, তাই আমি ত্রুটিটি পাস করেছি।
পাইরোলিস্টিকাল

1
@ ইথানহিলম্যান 2 এমবি মূল্যের যোগ করুন commons-lang3.3.1-sourcesএবং আপনি আর তেমন ভাল নন;) তবে কারও যদি ইতিমধ্যে থাকে তবে commons-langআমি আপনার উত্তরটিকে সমর্থন করি।
TWiStErRob

9

ফরট্রানের উত্তরের ভিত্তিতে , এটি একটি পুনরুক্তিযোগ্য সংস্করণ যা স্ট্রিংবিল্ডার ব্যবহার করে:

public static void repeat(StringBuilder stringBuilder, String s, int times) {
    if (times > 0) {
        repeat(stringBuilder.append(s), s, times - 1);
    }
}

public static String repeat(String s, int times) {
    StringBuilder stringBuilder = new StringBuilder(s.length() * times);
    repeat(stringBuilder, s, times);
    return stringBuilder.toString();
}

1
পুনরাবৃত্তির চেয়ে লুপিং বড় সংখ্যা পুনরাবৃত্তির জন্য স্ট্যাক ফ্রেমের # হ্রাস করে।
লা-কোমড্রেজা

7

ডলার ব্যবহার টাইপিংয়ের মতো সহজ:

@Test
public void repeatString() {
    String string = "abc";
    assertThat($(string).repeat(3).toString(), is("abcabcabc"));
}

PS: পুনরাবৃত্তি অ্যারে, তালিকা, সেট, ইত্যাদির জন্যও কাজ করে


3
সত্যিই কি assertThat () পদ্ধতির দরকার?
শে

7

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

private static String fun1(int size) {
    StringBuilder sb = new StringBuilder(size * 2);
    for (int i = 0; i < size; i++) {
        sb.append(",?");
    }
    return sb.substring(1);
}

private static String fun2(int size) {
    return new String(new char[size]).replaceAll("\0", ",?").substring(1);
}

3
আমি বুঝতে পারি যে দ্বিতীয়টি অনেক বেশি সময় নিতে পারে। এটি একটি স্ট্রিং অনুসন্ধান করছে এবং তারপরে অক্ষরে অক্ষরে স্ট্রিং চরিত্রটি পরিবর্তন করছে।
ইথান হেইলম্যান

7

ওওপি সলিউশন

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

নিম্নলিখিত বিভাগটি বিভাজক-স্ট্রিং / চারসেকেন্স বা তার সাথে ব্যবহার করা যেতে পারে এবং "টু স্ট্রিং ()" এ প্রতিটি কল চূড়ান্ত পুনরাবৃত্তি স্ট্রিং তৈরি করে। ইনপুট / বিভাজক কেবল স্ট্রিং-ক্লাসের মধ্যেই সীমাবদ্ধ নয়, তবে প্রতিটি শ্রেণি হতে পারে যা চারসিক্যেন্স প্রয়োগ করে (যেমন স্ট্রিংবিল্ডার, স্ট্রিংবফার ইত্যাদি)!

সোর্স কোড:

/**
 * Helper-Class for Repeating Strings and other CharSequence-Implementations
 * @author Maciej Schuttkowski
 */
public class RepeatingCharSequence implements CharSequence {
    final int count;
    CharSequence internalCharSeq = "";
    CharSequence separator = "";
    /**
     * CONSTRUCTOR - RepeatingCharSequence
     * @param input CharSequence to repeat
     * @param count Repeat-Count
     */
    public RepeatingCharSequence(CharSequence input, int count) {
        if(count < 0)
            throw new IllegalArgumentException("Can not repeat String \""+input+"\" less than 0 times! count="+count);
        if(count > 0)
            internalCharSeq = input;
        this.count = count;
    }
    /**
     * CONSTRUCTOR - Strings.RepeatingCharSequence
     * @param input CharSequence to repeat
     * @param count Repeat-Count
     * @param separator Separator-Sequence to use
     */
    public RepeatingCharSequence(CharSequence input, int count, CharSequence separator) {
        this(input, count);
        this.separator = separator;
    }

    @Override
    public CharSequence subSequence(int start, int end) {
        checkBounds(start);
        checkBounds(end);
        int subLen = end - start;
        if (subLen < 0) {
            throw new IndexOutOfBoundsException("Illegal subSequence-Length: "+subLen);
        }
        return (start == 0 && end == length()) ? this
                    : toString().substring(start, subLen);
    }
    @Override
    public int length() {
        //We return the total length of our CharSequences with the separator 1 time less than amount of repeats:
        return count < 1 ? 0
                : ( (internalCharSeq.length()*count) + (separator.length()*(count-1)));
    }
    @Override
    public char charAt(int index) {
        final int internalIndex = internalIndex(index);
        //Delegate to Separator-CharSequence or Input-CharSequence depending on internal index:
        if(internalIndex > internalCharSeq.length()-1) {
            return separator.charAt(internalIndex-internalCharSeq.length());
        }
        return internalCharSeq.charAt(internalIndex);
    }
    @Override
    public String toString() {
        return count < 1 ? ""
                : new StringBuilder(this).toString();
    }

    private void checkBounds(int index) {
        if(index < 0 || index >= length())
            throw new IndexOutOfBoundsException("Index out of Bounds: "+index);
    }
    private int internalIndex(int index) {
        // We need to add 1 Separator-Length to total length before dividing,
        // as we subtracted one Separator-Length in "length()"
        return index % ((length()+separator.length())/count);
    }
}

ব্যবহারের-উদাহরণ:

public static void main(String[] args) {
    //String input = "12345";
    //StringBuffer input = new StringBuffer("12345");
    StringBuilder input = new StringBuilder("123");
    //String separator = "<=>";
    StringBuilder separator = new StringBuilder("<=");//.append('>');
    int repeatCount = 2;

    CharSequence repSeq = new RepeatingCharSequence(input, repeatCount, separator);
    String repStr = repSeq.toString();

    System.out.println("Repeat="+repeatCount+"\tSeparator="+separator+"\tInput="+input+"\tLength="+input.length());
    System.out.println("CharSeq:\tLength="+repSeq.length()+"\tVal="+repSeq);
    System.out.println("String :\tLength="+repStr.length()+"\tVal="+repStr);

    //Here comes the Magic with a StringBuilder as Input, as you can append to the String-Builder
    //and at the same Time your Repeating-Sequence's toString()-Method returns the updated String :)
    input.append("ff");
    System.out.println(repSeq);
    //Same can be done with the Separator:
    separator.append("===").append('>');
    System.out.println(repSeq);
}

যেমন-আউটপুট:

Repeat=2    Separator=<=    Input=123   Length=3
CharSeq:    Length=8    Val=123<=123
String :    Length=8    Val=123<=123
123ff<=123ff
123ff<====>123ff

4
ঘৃণ্য জিনিসগুলি খুব কমই আমি দেখেছি: /
ভেন

6

কেবল জেআরই ক্লাস ( System.arraycopy ) ব্যবহার করে এবং অস্থায়ী বস্তুর সংখ্যা হ্রাস করার চেষ্টা করে আপনি এমন কিছু লিখতে পারেন:

public static String repeat(String toRepeat, int times) {
    if (toRepeat == null) {
        toRepeat = "";
    }

    if (times < 0) {
        times = 0;
    }

    final int length = toRepeat.length();
    final int total = length * times;
    final char[] src = toRepeat.toCharArray();
    char[] dst = new char[total];

    for (int i = 0; i < total; i += length) {
        System.arraycopy(src, 0, dst, i, length);
    }

    return String.copyValueOf(dst);
}

সম্পাদনা

এবং লুপ ছাড়াই আপনি এটি ব্যবহার করে দেখতে পারেন:

public static String repeat2(String toRepeat, int times) {
    if (toRepeat == null) {
        toRepeat = "";
    }

    if (times < 0) {
        times = 0;
    }

    String[] copies = new String[times];
    Arrays.fill(copies, toRepeat);
    return Arrays.toString(copies).
              replace("[", "").
              replace("]", "").
              replaceAll(", ", "");
}

সম্পাদনা 2

সংগ্রহগুলি ব্যবহার আরও ছোট:

public static String repeat3(String toRepeat, int times) {
    return Collections.nCopies(times, toRepeat).
           toString().
           replace("[", "").
           replace("]", "").
           replaceAll(", ", "");
}

তবে আমি এখনও প্রথম সংস্করণ পছন্দ করি।


6
-1: অর্ধেক দ্বারা খুব চালাক আপনার উদ্দেশ্য যদি আপনাকে কোড পাঠযোগ্য বা দক্ষ করে তোলা হয় তবে এই "সমাধানগুলি" কোনও ভাল ধারণা নয়। স্ট্রিংবিল্ডার (প্রাথমিক ক্ষমতা নির্ধারণ) ব্যবহার করে 'পুনরাবৃত্তি' সহজেই আবার লেখা যেতে পারে। এবং 'রিপিট 2' / 'রিপিট 3' আসলেই অদক্ষ এবং স্ট্রিং []। টু স্ট্রিং () দ্বারা উত্পাদিত স্ট্রিংয়ের অনির্ধারিত সিনট্যাক্সের উপর নির্ভর করে।
স্টিফেন সি

@ থরব: একেবারে এই কোড দিয়ে আপনি "মেটাচার্যাক্টর" ব্যবহার করতে পারবেন না, [],
ডিএফএ

@ স্টিফেন: স্পষ্টভাবে কোনও লুপগুলির অনুরোধের জন্য প্রশ্নটি সম্পাদিত হয়েছিল । একটি স্ট্রিংবিল্ডার ভিত্তিক উত্তর ইতিমধ্যে সরবরাহ করা হয়েছিল তাই আমি একটি সদৃশ পোস্ট করা এড়াতে
পেরেছি

@ স্টেফান: আমি ডাউনটোটের বিষয়টি বের করতে পারি না। আমার সম্পাদিত উত্তরটি অনুরূপ হিসাবে লুপ-মুক্ত- দক্ষতা সম্পর্কে কোন অনুরোধ নেই। আমি মনে করি যে এই প্রশ্নটি একটি লুপ ছাড়াই একটি যুক্তি তৈরির জন্য কেবল একটি বৌদ্ধিক প্রচেষ্টা
ডিএফএ

@ স্টেফান: সংগ্রহ.টো স্ট্রিংয়ের মাধ্যমে উত্পাদিত স্ট্রিং (এবং অ্যারেজ টো স্ট্রিং) স্পষ্টভাবে অ্যাবস্ট্র্যাক্ট কালেকশন.টোস্ট্রিংয়ে সুনির্দিষ্টভাবে উল্লেখ করা হয়েছে: "স্ট্রিং প্রতিনিধিত্ব সংগ্রহের উপাদানগুলির একটি তালিকা নিয়ে গঠিত যা এটির পুনরাবৃত্ত দ্বারা ফিরে আসে, বর্গাকার বন্ধনীগুলিতে আবদ্ধ ( "[]")। সংলগ্ন উপাদানগুলি "," (কমা এবং স্পেস) অক্ষর দ্বারা পৃথক করা হয়।
ডিএফএ

6

সংক্ষিপ্ততম নয়, তবে (আমার মনে হয়) স্ট্রিংবিল্ডারটি ব্যবহার করা সবচেয়ে দ্রুততম উপায়:

 /**
   * Repeat a String as many times you need.
   *
   * @param i - Number of Repeating the String.
   * @param s - The String wich you want repeated.
   * @return The string n - times.
   */
  public static String repeate(int i, String s) {
    StringBuilder sb = new StringBuilder();
    for (int j = 0; j < i; j++)
      sb.append(s);
    return sb.toString();
  }

5

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

public static String repeatString(String what, int howmany) {
    char[] pattern = what.toCharArray();
    char[] res = new char[howmany * pattern.length];
    int length = pattern.length;
    for (int i = 0; i < howmany; i++)
        System.arraycopy(pattern, 0, res, i * length, length);
    return new String(res);
}

গতি পরীক্ষা করার জন্য, স্ট্রংবিল্ডার ব্যবহার করে অনুরূপ সর্বোত্তম পদ্ধতিটি এরকম:

public static String repeatStringSB(String what, int howmany) {
    StringBuilder out = new StringBuilder(what.length() * howmany);
    for (int i = 0; i < howmany; i++)
        out.append(what);
    return out.toString();
}

এবং এটি পরীক্ষা করার কোড:

public static void main(String... args) {
    String res;
    long time;

    for (int j = 0; j < 1000; j++) {
        res = repeatString("123", 100000);
        res = repeatStringSB("123", 100000);
    }

    time = System.nanoTime();
    res = repeatString("123", 1000000);
    time = System.nanoTime() - time;
    System.out.println("elapsed repeatString: " + time);

    time = System.nanoTime();
    res = repeatStringSB("123", 1000000);
    time = System.nanoTime() - time;
    System.out.println("elapsed repeatStringSB: " + time);

}

এবং এখানে আমার সিস্টেম থেকে রান ফলাফল:

elapsed repeatString: 6006571
elapsed repeatStringSB: 9064937

নোট করুন যে লুপের পরীক্ষাটি হচ্ছে জেআইটিতে কিক করা এবং সর্বোত্তম ফলাফল পাওয়া উচিত।



3

আপনি যদি কর্মক্ষমতা সম্পর্কে উদ্বিগ্ন হন তবে লুপের অভ্যন্তরে কেবল একটি স্ট্রিংবিল্ডার ব্যবহার করুন এবং লুপের প্রস্থান করার সময় একটি .toString () করুন। হেক, আপনার নিজের ইউটিলি ক্লাস লিখুন এবং এটি পুনরায় ব্যবহার করুন। কোড সর্বাধিক 5 লাইন।


2

আমি সত্যিই এই প্রশ্ন উপভোগ। জ্ঞান এবং শৈলী অনেক আছে। সুতরাং আমি আমার রক অ্যান্ড রোল না দেখিয়ে এটি ছেড়ে দিতে পারি না;)

{
    String string = repeat("1234567890", 4);
    System.out.println(string);
    System.out.println("=======");
    repeatWithoutCopySample(string, 100000);
    System.out.println(string);// This take time, try it without printing
    System.out.println(string.length());
}

/**
 * The core of the task.
 */
@SuppressWarnings("AssignmentToMethodParameter")
public static char[] repeat(char[] sample, int times) {
    char[] r = new char[sample.length * times];
    while (--times > -1) {
        System.arraycopy(sample, 0, r, times * sample.length, sample.length);
    }
    return r;
}

/**
 * Java classic style.
 */
public static String repeat(String sample, int times) {
    return new String(repeat(sample.toCharArray(), times));
}

/**
 * Java extreme memory style.
 */
@SuppressWarnings("UseSpecificCatch")
public static void repeatWithoutCopySample(String sample, int times) {
    try {
        Field valueStringField = String.class.getDeclaredField("value");
        valueStringField.setAccessible(true);
        valueStringField.set(sample, repeat((char[]) valueStringField.get(sample), times));
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

আপনার কি এটা পছন্দ হয়েছে?


1
আমার আরও চরম পরীক্ষায় আমি একটি 1,700,000,000 (1.7 গিগা) স্ট্রিং পুনরাবৃত্ত দৈর্ঘ্য তৈরি করি, -Xms4937m ব্যবহার করে
ড্যানিয়েল ডি লিয়ন

2
public static String repeat(String str, int times) {
    int length = str.length();
    int size = length * times;
    char[] c = new char[size];
    for (int i = 0; i < size; i++) {
        c[i] = str.charAt(i % length);
    }
    return new String(c);
}

2

সরল লুপ

public static String repeat(String string, int times) {
    StringBuilder out = new StringBuilder();
    while (times-- > 0) {
        out.append(string);
    }
    return out.toString();
}

2
timesস্ট্রিংবিল্ডার কনস্ট্রাক্টরে পাস করুন ।
বেহরোজ.এম

2

এটি ব্যবহার করে দেখুন:

public static char[] myABCs = {'a', 'b', 'c'};
public static int numInput;
static Scanner in = new Scanner(System.in);

public static void main(String[] args) {
    System.out.print("Enter Number of Times to repeat: ");
    numInput = in.nextInt();
    repeatArray(numInput);
}

public static int repeatArray(int y) {
    for (int a = 0; a < y; a++) {
        for (int b = 0; b < myABCs.length; b++) {
            System.out.print(myABCs[b]);                
        }
        System.out.print(" ");
    }
    return y;
}

2

পুনরাবৃত্তি ব্যবহার করে, আপনি নিম্নলিখিতগুলি করতে পারেন (টের্নারি অপারেটরগুলি, একটি লাইন সর্বাধিক ব্যবহার করে):

public static final String repeat(String string, long number) {
    return number == 1 ? string : (number % 2 == 0 ? repeat(string + string, number / 2) : string + repeat(string + string, (number - 1) / 2));
}

আমি জানি, এটি কুরুচিপূর্ণ এবং সম্ভবত দক্ষ নয়, তবে এটি এক লাইন!


এটিই আমি গ্রহণ করব তবে কেন প্রয়োজনের চেয়ে বেশি চেক করা যায়? রিটার্ন নম্বর> 0? স্ট্রিং + পুনরাবৃত্তি (স্ট্রিং, সংখ্যা -1): "";
শোভাযাত্রা

ওহ, niczm25 নীচে এটির উত্তর দিয়েছিল বলে মনে হচ্ছে
ফায়ারিং

@ প্রধান কারণটি যাতে সর্বদা ও (এন) এর চেয়ে ও (লগ এন) গড় হয় is অন্যটির তুলনায় সামান্য বেশি অপ্টিমাইজেশন, যদিও তবুও খারাপ।
হাইপারনিউটারিনো

2

একটি সরল এক-লাইন সমাধান:
জাভা 8 প্রয়োজন

Collections.nCopies( 3, "abc" ).stream().collect( Collectors.joining() );

1

আপনার লুপগুলি ব্যবহার না করার ইচ্ছা থাকা সত্ত্বেও, আমি মনে করি আপনার একটি লুপ ব্যবহার করা উচিত।

String repeatString(String s, int repetitions)
{
    if(repetitions < 0) throw SomeException();

    else if(s == null) return null;

    StringBuilder stringBuilder = new StringBuilder(s.length() * repetitions);

    for(int i = 0; i < repetitions; i++)
        stringBuilder.append(s);

    return stringBuilder.toString();
}

লুপের জন্য ব্যবহার না করার জন্য আপনার কারণগুলি ভাল নয়। আপনার সমালোচনার জবাবে:

  1. আপনি যে কোনও সমাধান ব্যবহার করুন এটি অবশ্যই এর চেয়ে দীর্ঘতর হবে। প্রাক-বিল্ট ফাংশন ব্যবহার করা কেবল এটি আরও কভারের আওতায় পড়ে।
  2. আপনার কোডটি পড়ছেন এমন কেউ যদি বুঝতে পারে যে আপনি সেই অন-লুপটিতে কী করছেন। ফোর-লুপটি হ'ল এটি করার মতো প্রতিমাসংক্রান্ত উপায়, এটি লুপের জন্য যদি আপনি এটি করেন তবে তা নির্ধারণ করা খুব সহজ।
  3. হ্যাঁ কেউ কিছু চালাক যোগ পারে, কিন্তু লুপ জন্য একটি এড়িয়ে আপনি হয় কিছু চালাক করছেন । এটি দুর্ঘটনাক্রমে পায়ে নিজেকে শুটিং এড়াতে ইচ্ছাকৃতভাবে নিজেকে পায়ে গুলি করার মতো।
  4. একের পর এক ত্রুটিগুলিও একক পরীক্ষার সাথে ধরা সহজ মায়াময়। আপনার কোডটি পরীক্ষা করা উচিত এমনটি প্রদত্ত, একটি অফ বাই এক ত্রুটি ঠিক করা এবং ধরা সহজ হওয়া উচিত। এবং এটি লক্ষণীয় মূল্য: উপরের কোডটিতে একের পর এক ত্রুটি নেই। লুপগুলির জন্য সঠিকভাবে পাওয়া সমান সহজ।
  5. সুতরাং ভেরিয়েবল পুনরায় ব্যবহার করবেন না। এটি লুপের দোষ নয়।
  6. আবার, আপনি যে কোনও সমাধান ব্যবহার করুন does এবং যেমনটি আমি আগে উল্লেখ করেছি; একটি বাগ শিকারী সম্ভবত আপনাকে লুপের জন্য এটি করার প্রত্যাশা করবে, সুতরাং আপনি লুপের জন্য যদি এটি ব্যবহার করেন তবে এটি খুঁজে পেতে তাদের আরও সহজ সময় পাবে।

3
-1। আপনার জন্য এখানে দুটি অনুশীলন: ক) আপনার কোডটি দিয়ে চালান repetitions = -5। খ) কমন্স ল্যাং ডাউনলোড করুন repeatString('a', 1000)এবং একটি লুপে এক মিলিয়ন বার চালান ; আপনার কোড দিয়ে একই করুন; সময় তুলনা করুন। অতিরিক্ত creditণের জন্য একই কাজ করুন repeatString('ab', 1000)
ChssPly76

2
আপনি কি যুক্তি দিচ্ছেন যে আপনার কোডটি তখন বেশি পঠনযোগ্য StringUtils.repeat("ab",1000)? কারণ এটি ছিল আমার উত্তর যে আপনি হ্রাস পেয়েছেন। এটি আরও ভাল পারফর্ম করে এবং এতে কোনও বাগ নেই।
ChssPly76

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

2
@ ChssPly76 এই মুহুর্তে আমি নিশ্চিত যে ইমামজিস্ট ট্রল করছেন। আমার লেখাটি যে কেউ কীভাবে পড়তে পারে এবং উপরে টাইপ করা প্রতিক্রিয়াগুলি গুরুত্ব সহকারে ভাবতে পারে তা দেখতে আমার খুব কষ্ট হয়।
ইথান হেলম্যান

1
@ ChssPly76 আমার উত্তর সব :-p কোনো লুপ হবে না
ফোরট্রান

1

যদি আপনি কেবল আউটপুট স্ট্রিংয়ের দৈর্ঘ্য জানেন (এবং এটি ইনপুট স্ট্রিংয়ের দৈর্ঘ্যের দ্বারা বিভাজ্য নাও হতে পারে), তবে এই পদ্ধতিটি ব্যবহার করুন:

static String repeat(String s, int length) {
    return s.length() >= length ? s.substring(0, length) : repeat(s + s, length);
}

ব্যবহারের ডেমো:

for (int i = 0; i < 50; i++)
    System.out.println(repeat("_/‾\\", i));

খালি sএবং length> 0 দিয়ে ব্যবহার করবেন না , যেহেতু এই ক্ষেত্রে পছন্দসই ফলাফল পাওয়া অসম্ভব।


0

এখানে সর্বশেষতম স্ট্রিংগিলস.জভা স্ট্রিংটিল.জভা রয়েছে

    public static String repeat(String str, int repeat) {
    // Performance tuned for 2.0 (JDK1.4)

    if (str == null) {
        return null;
    }
    if (repeat <= 0) {
        return EMPTY;
    }
    int inputLength = str.length();
    if (repeat == 1 || inputLength == 0) {
        return str;
    }
    if (inputLength == 1 && repeat <= PAD_LIMIT) {
        return repeat(str.charAt(0), repeat);
    }

    int outputLength = inputLength * repeat;
    switch (inputLength) {
        case 1 :
            return repeat(str.charAt(0), repeat);
        case 2 :
            char ch0 = str.charAt(0);
            char ch1 = str.charAt(1);
            char[] output2 = new char[outputLength];
            for (int i = repeat * 2 - 2; i >= 0; i--, i--) {
                output2[i] = ch0;
                output2[i + 1] = ch1;
            }
            return new String(output2);
        default :
            StringBuilder buf = new StringBuilder(outputLength);
            for (int i = 0; i < repeat; i++) {
                buf.append(str);
            }
            return buf.toString();
    }
    }

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

    public static String repeat(String str, int num) {
    int len = num * str.length();
    StringBuilder sb = new StringBuilder(len);
    for (int i = 0; i < times; i++) {
        sb.append(str);
    }
    return sb.toString();
    }

সুতরাং e5, আমি মনে করি এটি করার সর্বোত্তম উপায়টি হ'ল এখানে বর্ণিত কোডগুলি বা উত্তরগুলির মধ্যে কেবল ব্যবহার করা। যদি কম প্রকল্পটি হয় তবে কমন্স ল্যাং এটি খুব বড়


আমার মনে হয় না আপনি আরও অনেক কিছু করতে পারেন ... এক্সটসেট সম্ভবত একটি এওটি !!
alexmherrmann

0

আমি একটি পুনরাবৃত্তির পদ্ধতি তৈরি করেছি যা আপনি চান একই কাজ করেন .. এটি ব্যবহার করতে নির্দ্বিধায় ...

public String repeat(String str, int count) {
    return count > 0 ?  repeat(str, count -1) + str: "";
}

আমি একই উপর উত্তর আছে পুনরাবৃত্তি সিকোয়েন্স থেকে জাভা পাবেনা আমি সংখ্যাবৃদ্ধি স্ট্রিং?


অকারণে স্ট্রিং রিলোকেশন এবং পুনরাবৃত্তি ওভারহেড ... খারাপ, খারাপ, ভাল নয়।
আলেকজান্ডার - মনিকা

1
এটি ধীর হবে। প্রস্তাবিত নয়! StringBuilderপরিবর্তে ব্যবহার করুন।
স্বেতলিন নাকভ

0
public static String rep(int a,String k)

       {
           if(a<=0)
                return "";
           else 
           {a--;
               return k+rep(a,k);
       }

আপনার কাঙ্ক্ষিত লক্ষ্যটির জন্য আপনি এই পুনরাবৃত্ত পদ্ধতিটি ব্যবহার করতে পারেন।

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