สร้างสตริงที่มีอักขระ n ตัว


144

มีวิธีใน java เพื่อสร้างสตริงที่มีจำนวนอักขระที่ระบุหรือไม่ ในกรณีของฉันฉันจะต้องสร้างสตริงที่มี 10 ช่องว่าง รหัสปัจจุบันของฉันคือ:

StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
   outputBuffer.append(" ");
}
return outputBuffer.toString();

มีวิธีที่ดีกว่าในการบรรลุสิ่งเดียวกัน โดยเฉพาะอย่างยิ่งฉันต้องการบางสิ่งที่รวดเร็ว (ในแง่ของการประหารชีวิต)


1
หากคุณพบว่าตัวเองกำลังทำอะไรมากมายเพียงแค่เขียนฟังก์ชั่น: String characterRepeat (Char c, int Length) {... } ซึ่งทำสิ่งที่คุณทำเพื่อตัวละครและความยาว จากนั้นเพียงแค่เรียกมันเมื่อคุณต้องการ
Austin Fitzpatrick

12
คุณต้องการใช้ StringBuilder แทน StringBuffer

เพิ่มขนาดของบัฟเฟอร์ที่เริ่มต้นทำให้ง่ายต่อการคำนวณสิ่งอำนวยความสะดวกในการจัดการหน่วยความจำ! StringBuilder outputBuffer = ใหม่ StringBuilder (ซ้ำ * base.length ());
Victor

1
ดูเพิ่มเติมได้ที่: stackoverflow.com/questions/1235179/…
เดฟจา

หากคุณต้องการที่จะผนวกพื้นที่เดียวใช้append(' ')แทน ... มันเกี่ยวข้องกับนิด ๆ หน่อย ๆ น้อยคอมพิวเตอร์ ...
Erk

คำตอบ:


36

คอมไพเลอร์จะปรับให้เหมาะสมสำหรับ ในกรณีเช่นนี้กับคุณคุณไม่จำเป็นต้องกังวลเกี่ยวกับการปรับให้เหมาะสมด้วยตัวเอง เชื่อถือคอมไพเลอร์

BTW หากมีวิธีการสร้างสตริงที่มีอักขระช่องว่าง n ตัวมากกว่าจะเป็นรหัสในแบบเดียวกับที่คุณเพิ่งทำ


1
แม้ว่าสิ่งนี้จะไม่ได้รับการปรับปรุง - ความถี่นี้ถูกสร้างขึ้นในโปรแกรมของคุณ - บ่อยครั้งที่บันทึกในตัวแปรคงที่หรือแคชอื่น ๆ
mmmmmm

btw Array.fill () แค่วนรอบอาร์เรย์ / ฉันต้องการคะแนนที่ชัดเจนยิ่งขึ้นเพื่อแสดงความคิดเห็นในโพสต์อื่น :)
kalkin

@ Mark Length เป็นตัวแปรดังนั้นจึงดูเหมือนว่าโง่ที่จะบันทึก ฉันจะทำยังstatic Dictionary<int, String>ไง
C. Ross

1
ร้านค้าที่ยาวที่สุดที่คุณจะเคยต้องการสตริงแล้วใช้อะไรเช่นนี้ " ".substring(0, 10);
mjaggard

169

น่าจะเป็นรหัสที่สั้นที่สุดโดยใช้StringAPI โดยเฉพาะ:

String space10 = new String(new char[10]).replace('\0', ' ');

System.out.println("[" + space10 + "]");
// prints "[          ]"

เป็นวิธีการโดยไม่ต้องยกตัวอย่างโดยตรงchar:

import java.nio.CharBuffer;

/**
 * Creates a string of spaces that is 'spaces' spaces long.
 *
 * @param spaces The number of spaces to add to the string.
 */
public String spaces( int spaces ) {
  return CharBuffer.allocate( spaces ).toString().replace( '\0', ' ' );
}

เรียกใช้โดย:

System.out.printf( "[%s]%n", spaces( 10 ) );

4
แม้ว่าฉันจะชอบซับผมคิดว่าวิธีแก้ปัญหาของ FrustratedWithFormsDes นั้นดีกว่าเมื่อพูดถึงการประมวลผลเพราะมันหลีกเลี่ยงการตรวจสอบ \ 0 แต่ละอันและกำหนดพื้นที่
Bouncner

1
ผ่านการทดสอบนี่เร็วกว่าลูปค่อนข้างเร็วอย่างต่อเนื่อง 50,000-100,000 นาโนวินาทีเร็วขึ้นซึ่งอาจมีนัยสำคัญมาก (0.1 มิลลิวินาที) ลูปจะเร็วขึ้นเมื่อจำนวนการทำซ้ำเพิ่มขึ้นแม้ว่าเวลาทั้งหมดจะยังคงสูง สิ่งนี้ถือเป็นจริงเมื่อทำการสร้างขนาดของสตริงพื้นที่
kmecpp

กระโจนขึ้นสำหรับการแก้ปัญหาที่ดีงามฉันได้ใช้มันในคำตอบของฉันที่นี่stackoverflow.com/questions/852665/…
maytham-ɯɐɥʇʎɐɯ

66

อืมตอนนี้ฉันคิดแล้วบางทีArrays.fill:

char[] charArray = new char[length];
Arrays.fill(charArray, ' ');
String str = new String(charArray);

แน่นอนฉันคิดว่าfillวิธีการทำเช่นเดียวกับรหัสของคุณดังนั้นมันอาจจะทำงานเกี่ยวกับเดียวกัน แต่อย่างน้อยก็เป็นเส้นที่น้อยลง


2
หลังจากตรวจสอบแหล่งที่มาดูเหมือนว่าสิ่งนี้จริง ๆ แล้วทำสิ่งที่ OP โพสต์: บรรทัด 806 ของdocjar.com/html/api/java/util/Arrays.java.html
Pops

2
@Lord Torgamus แก้ไขคำถามของ OP แล้วหรือยัง เพราะในเวอร์ชั่นที่ฉันเห็นเขากำลังวนรอบ StringBuffer.append () และเวอร์ชันของ Frustrated กำลังทำการเติม (ซึ่งแน่นอนว่าลูปกำลังทำการมอบหมายอักขระให้อาร์เรย์) ไม่เหมือนกันเลย
CPerkins

@ CPerkins ยุติธรรมพอฉันไม่ชัดเจน ประเด็นของฉันคือการที่พวกเขาทั้งสองแทรกตัวละครทีละตัวภายในวงสำหรับ
Pops

1
@ ลอร์ด Torgamus - เห็นด้วยกับที่ สงสาร jvm ไม่สามารถทำ memset ได้ ราคาที่เราจ่ายสำหรับตัวละครกว้าง
CPerkins

2
@Pops เป็นเรื่องที่น่าสังเกตว่าหากใช้Arrays.fill()ฟังก์ชั่นนี้อย่างสม่ำเสมอสำหรับการทำงานข้ามรหัสของคุณและรหัสห้องสมุด (มาตรฐานและภายนอก) ก็จะทำให้ผู้สมัครที่ดีสำหรับการรวบรวมฮอตสปอตและโอกาสที่ดีในการพบแคช CPU ของคุณ JVM ในอนาคตอาจกำหนดให้เป็นฟังก์ชั่นภายใน กลิ้งตัวคุณเองตัดคุณออกไปจากคุณงามความดีทุกอย่าง ...
SusanW

65

ฉันขอแนะนำว่าอย่าเขียนลูปด้วยมือ คุณจะทำเช่นนั้นซ้ำแล้วซ้ำอีกในระหว่างการทำงานด้านการเขียนโปรแกรมของคุณ ผู้คนที่อ่านโค้ดของคุณ - ซึ่งรวมถึงคุณ - ต้องใช้เวลาในการลงทุนเสมอแม้ว่าจะเป็นเพียงไม่กี่วินาทีเท่านั้นที่จะแยกแยะความหมายของลูป

แทนที่จะใช้หนึ่งในไลบรารีที่มีอยู่ซึ่งให้รหัสที่เหมือนStringUtils.repeatจากApache Commons Lang แทน :

StringUtils.repeat(' ', length);

ด้วยวิธีนี้คุณไม่ต้องกังวลกับประสิทธิภาพการทำงานดังนั้นรายละเอียดทั้งหมดของStringBuilderคอมไพเลอร์ออพติไมชั่น ฯลฯ จึงถูกซ่อนไว้ หากฟังก์ชั่นจะเปิดออกช้ามันจะเป็นข้อบกพร่องของห้องสมุด

ด้วยJava 11มันจะง่ายยิ่งขึ้น:

" ".repeat(length);

5
ในทางตรงกันข้ามถ้า StringUtils ไม่ได้ใช้ในโครงการเพิ่มการพึ่งพาอื่นสำหรับงานง่าย ๆ เช่นนี้อาจเป็นงานเกินจริง
Erich Kitzmueller

1
หากการเปิดใช้งานช้าคุณสามารถส่งการแก้ไขของคุณเองสำหรับฟังก์ชั่น
จะ


13

หากคุณต้องการช่องว่างเพียงอย่างเดียวแล้ววิธีการเกี่ยวกับ:

String spaces = (n==0)?"":String.format("%"+n+"s", "");

ซึ่งจะส่งผลให้ช่องว่าง abs (n);


6
เป็นอย่างไรสำหรับความเร็ว ฉันอยู่ในรูปแบบการแสดงผลค่อนข้างช้า มันต้องแยกสตริงก่อนที่จะสามารถสร้างมันหลังจากทั้งหมด
C. Ross

11

ตั้งแต่Java 11 :

" ".repeat(10);

ตั้งแต่Java 8 :

generate(() -> " ").limit(10).collect(joining());

ที่อยู่:

import static java.util.stream.Collectors.joining;
import static java.util.stream.Stream.generate;

9

ตั้งแต่ Java 11 คุณสามารถใช้String.repeat(count)เพื่อแก้ปัญหาของคุณ

ส่งคืนสตริงที่มีค่าคือการต่อข้อมูลของสตริงนี้ซ้ำหลายcountครั้ง

หากสตริงนี้ว่างเปล่าหรือcountเป็นศูนย์ดังนั้นสตริงที่ว่างเปล่าจะถูกส่งกลับ

ดังนั้นแทนที่จะวนลูปรหัสของคุณจะมีลักษณะเช่นนี้:

" ".repeat(length);

8

ฉันคิดว่านี่เป็นโค้ดที่น้อยกว่าที่เป็นไปได้ใช้คลาส Guava Joiner:

Joiner .on (""). เข้าร่วม ( Collections.nCopies (10, ""));


บรรทัดที่สั้นที่สุดของรหัส แต่การเพิ่มไลบรารีขนาดใหญ่สำหรับงานง่าย ๆ นั้นไม่สมเหตุสมผล ฉันสามารถสร้าง JAR ขนาดเล็กลงได้ด้วยวิธีการเดียวpubic String n(int n) { ... }ซึ่งจะยอมให้แม้แต่โค้ด "less": n(10)แต่อีกครั้งก็ไม่สมเหตุสมผล
isapir

@isapir นี่เป็นคำตอบที่ยอดเยี่ยมสำหรับผู้ที่ใช้ Guava อยู่แล้ว
nasch

1
@nasch Guava ไม่ได้เป็นส่วนหนึ่งของคำถาม แต่อย่างไรก็ตามในปี 2018 ไม่มีเหตุผลที่จะใช้ตัวเชื่อมต่อของ Guava เมื่อคุณสามารถใช้ String.join () ซึ่งถูกเพิ่มใน Java 8 ดูstackoverflow.com/a/43011939/968244
isapir

@isapir ไม่ Guava เป็นคำตอบ รู้รอบใน StackOverflow มีผู้ชมมากกว่าคนที่ถามคำถามดังนั้นจึงเป็นเรื่องที่ดีถ้าคำตอบบางอย่างไม่ดีที่สุดสำหรับคนที่ถาม และความคิดเห็นเกี่ยวกับ String.join () เป็นสิ่งที่ยอดเยี่ยมแม้ว่าฉันจะไม่แน่ใจว่ามันมีอยู่ใน Android ทุกรุ่นหรือไม่ซึ่งเป็นการใช้จาวาที่โดดเด่น
nasch

7

คุณสามารถใช้String.formatฟังก์ชั่นมาตรฐานสำหรับการสร้างช่องว่าง N ตัวอย่างเช่น:

String.format("%5c", ' ');

ทำให้สตริงมี 5 ช่องว่าง

หรือ

int count = 15;
String fifteenSpacebars = String.format("%" + count + "c", ' ');

ทำให้สตริงของ 15 spacebars

หากคุณต้องการให้สัญลักษณ์อื่นซ้ำคุณต้องแทนที่ช่องว่างด้วยสัญลักษณ์ที่คุณต้องการ:

int count = 7;
char mySymbol = '#';
System.out.println(String.format("%" + count + "c", ' ').replaceAll("\\ ", "\\" + mySymbol));

เอาท์พุท:

#######

6

ผลงานของฉันขึ้นอยู่กับอัลกอริทึมสำหรับการยกกำลังอย่างรวดเร็ว

/**
 * Repeats the given {@link String} n times.
 * 
 * @param str
 *            the {@link String} to repeat.
 * @param n
 *            the repetition count.
 * @throws IllegalArgumentException
 *             when the given repetition count is smaller than zero.
 * @return the given {@link String} repeated n times.
 */
public static String repeat(String str, int n) {
    if (n < 0)
        throw new IllegalArgumentException(
                "the given repetition count is smaller than zero!");
    else if (n == 0)
        return "";
    else if (n == 1)
        return str;
    else if (n % 2 == 0) {
        String s = repeat(str, n / 2);
        return s.concat(s);
    } else
        return str.concat(repeat(str, n - 1));
}

ฉันทดสอบอัลกอริทึมกับอีกสองวิธี:

  • ปกติสำหรับการวนซ้ำที่ใช้String.concat()เพื่อเชื่อมสตริง
  • ปกติสำหรับการวนซ้ำโดยใช้ StringBuilder

รหัสทดสอบ (การต่อข้อมูลโดยใช้ for for loop และString.concat()จะช้าลงสำหรับขนาดใหญ่nดังนั้นฉันจึงทิ้งมันไว้หลังจากการทำซ้ำครั้งที่ 5)

/**
 * Test the string concatenation operation.
 * 
 * @param args
 */
public static void main(String[] args) {
    long startTime;
    String str = " ";

    int n = 1;
    for (int j = 0; j < 9; ++j) {
        n *= 10;
        System.out.format("Performing test with n=%d\n", n);

        startTime = System.currentTimeMillis();
        StringUtil.repeat(str, n);
        System.out
                .format("\tStringUtil.repeat() concatenation performed in    %d milliseconds\n",
                        System.currentTimeMillis() - startTime);

        if (j <5) {
            startTime = System.currentTimeMillis();
            String string = "";
            for (int i = 0; i < n; ++i)
                string = string.concat(str);
            System.out
                    .format("\tString.concat() concatenation performed in        %d milliseconds\n",
                            System.currentTimeMillis() - startTime);
        } else
            System.out
                    .format("\tString.concat() concatenation performed in        x milliseconds\n");
        startTime = System.currentTimeMillis();
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < n; ++i)
            b.append(str);
        b.toString();
        System.out
                .format("\tStringBuilder.append() concatenation performed in %d milliseconds\n",
                        System.currentTimeMillis() - startTime);
    }
}

ผล:

Performing test with n=10
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        0 milliseconds
    StringBuilder.append() concatenation performed in 0 milliseconds
Performing test with n=100
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        1 milliseconds
    StringBuilder.append() concatenation performed in 0 milliseconds
Performing test with n=1000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        1 milliseconds
    StringBuilder.append() concatenation performed in 1 milliseconds
Performing test with n=10000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        43 milliseconds
    StringBuilder.append() concatenation performed in 5 milliseconds
Performing test with n=100000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        1579 milliseconds
    StringBuilder.append() concatenation performed in 1 milliseconds
Performing test with n=1000000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 10 milliseconds
Performing test with n=10000000
    StringUtil.repeat() concatenation performed in    7 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 112 milliseconds
Performing test with n=100000000
    StringUtil.repeat() concatenation performed in    80 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 1107 milliseconds
Performing test with n=1000000000
    StringUtil.repeat() concatenation performed in    1372 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 12125 milliseconds

สรุป:

  • สำหรับขนาดใหญ่n- ใช้วิธีเรียกซ้ำ
  • สำหรับขนาดเล็กn- สำหรับลูปมีความเร็วเพียงพอ

4
นี่คือการดำเนินการที่น่าสนใจ น่าเสียดายตรงข้ามกับข้อสรุปของคุณมันไม่มีประสิทธิภาพมากสำหรับ n ขนาดใหญ่ ฉันสงสัยว่านี่เป็นเพราะการจัดสรรหน่วยความจำจำนวนมากที่เกิดขึ้นทุกครั้งที่คุณเชื่อมสตริงเข้าด้วยกัน ลองเขียนมันเป็น wrapper โดยใช้วิธีเรียกซ้ำที่ใช้ StringBuilder แทน String ฉันเดิมพันคุณจะพบผลลัพธ์จะดีขึ้นมาก
Klitos Kyriacou

3
มีข้อควรระวังมากมายที่คุณต้องใช้เมื่อทำการเปรียบเทียบไมโครกับสิ่งนี้และฉันไม่คิดว่าคุณจะทำสิ่งเหล่านี้! คำถามเกี่ยวกับประสิทธิภาพที่โดดเด่นเกี่ยวกับรหัสนี้อาจเป็นได้อย่างง่ายดายไม่ว่าจะเป็น Hotspot ที่คอมไพล์แล้วจะสร้างขยะมากน้อยเพียงใดฉันเชื่อว่าifงบทั้งหมดเหล่านี้จะทำให้การคาดการณ์ของซีพียูแตกต่างกันไป นี่ควรจะทำใหม่โดยใช้ JMH ( openjdk.java.net/projects/code-tools/jmh ) มิฉะนั้นมันจะไร้ประโยชน์เล็กน้อย
SusanW

โปรดทราบว่าการใช้งานนี้มีความซับซ้อน O (n * log n) ในขณะที่ StringBuilder คือ O (n) :)
Leo Leontev


4

พิจารณาว่าเรามี:

String c = "c"; // character to repeat, for empty it would be " ";
int n = 4; // number of times to repeat
String EMPTY_STRING = ""; // empty string (can be put in utility class)

Java 8 (การใช้สตรีม)

String resultOne = IntStream.range(0,n)
   .mapToObj(i->c).collect(Collectors.joining(EMPTY_STRING)); // cccc

Java 8 (ใช้ nCopies)

String resultTwo = String.join(EMPTY_STRING, Collections.nCopies(n, c)); //cccc

1
Collectors.joining(EMPTY_STRING)เทียบเท่ากับCollectors.joining()
PPartisan

2

RandomStringUtilsมีบทบัญญัติในการสร้างสตริงจากขนาดอินพุตที่กำหนด ไม่สามารถแสดงความคิดเห็นเกี่ยวกับความเร็ว แต่มันเป็นหนึ่งซับ

RandomStringUtils.random(5,"\t");

สร้างผลลัพธ์

\ t \ t \ t \ t \ t

ดีกว่าถ้าคุณไม่ต้องการเห็น\ 0ในรหัสของคุณ



1

ในกรณีส่วนใหญ่คุณจะต้องใช้สตริงที่มีความยาวไม่เกิน 100 ตัว คุณสามารถเตรียมอาร์เรย์ของ Strings โดยที่หมายเลขดัชนีเท่ากับขนาดของสตริงที่เติมช่องว่างแล้วค้นหาสตริงหากความยาวที่ต้องการนั้นอยู่ภายในขีด จำกัด หรือสร้างตามต้องการหากอยู่นอกขอบเขต


1

ทางออกที่สั้นที่สุดกับ Guava:

Strings.repeat(" ", len)

ผ่านวิธีง่ายๆในการทำซ้ำสตริงในจาวา


0

เพียงแค่เปลี่ยน StringBuffer ของคุณด้วยStringBuilder ยากที่จะเอาชนะว่า

หากความยาวของคุณเป็นจำนวนมากคุณอาจใช้การผนวกตัวเองที่มีประสิทธิภาพมากขึ้น (แต่เงอะงะมากขึ้น) การทำซ้ำความยาวในการทำซ้ำแต่ละครั้ง:

 public static String dummyString(char c, int len) {
  if( len < 1 ) return "";
  StringBuilder sb = new StringBuilder(len).append(c);
  int remnant = len - sb.length();
  while(remnant  > 0) {
   if( remnant  >= sb.length() ) sb.append(sb);
   else sb.append(sb.subSequence(0, remnant));
   remnant  = len - sb.length();
  }
  return sb.toString();
 }

นอกจากนี้คุณอาจลองArrays.fill()aproach ( คำตอบของFrustratedWithFormsDesigner )


คุณสามารถตั้งชื่อตัวแปรมากกว่าหนึ่งตัวได้ไหม?
C. Ross

0

คุณสามารถแทนที่StringBufferด้วยStringBuilder (หลังไม่ได้รับการประสานอาจจะเร็วขึ้นในแอพพลิเคชั่นหัวข้อเดียว)

และคุณสามารถสร้างStringBuilderอินสแตนซ์หนึ่งครั้งแทนที่จะสร้างมันในแต่ละครั้งที่คุณต้องการ

บางสิ่งเช่นนี้

class BuildString {
     private final StringBuilder builder = new StringBuilder();
     public String stringOf( char c , int times ) {

         for( int i = 0 ; i < times ; i++  ) {
             builder.append( c );
         }
         String result = builder.toString();
         builder.delete( 0 , builder.length() -1 );
         return result;
      }

  }

และใช้มันเช่นนี้

 BuildString createA = new BuildString();
 String empty = createA.stringOf( ' ', 10 );

ถ้าคุณถือของคุณ createAเป็นตัวแปรอินสแตนซ์คุณอาจประหยัดเวลาในการสร้างอินสแตนซ์

นี่ไม่ปลอดภัยเธรดถ้าคุณมีหลายเธรดแต่ละเธรดควรมีสำเนาของตนเอง


0

เพื่อประสิทธิภาพที่ดีให้รวมคำตอบจากaznilamirและจากFrustratedWithFormsDesigner

private static final String BLANKS = "                       ";
private static String getBlankLine( int length )
{
    if( length <= BLANKS.length() )
    {
        return BLANKS.substring( 0, length );
    }
    else
    {
        char[] array = new char[ length ];
        Arrays.fill( array, ' ' );
        return new String( array );
    }
}

ปรับขนาดBLANKSขึ้นอยู่กับความต้องการของคุณ BLANKSสตริงเฉพาะของฉันมีความยาวประมาณ 200 ตัวอักษร


0

มีวิธีการเช่นนี้ ต่อท้ายช่องว่างที่ต้องการในตอนท้ายของที่กำหนดStringเพื่อให้Stringความยาวที่กำหนดของความยาวที่กำหนด

public static String fillSpaces (String str) {

    // the spaces string should contain spaces exceeding the max needed
    String spaces = "                                                   ";
    return str + spaces.substring(str.length());
}

0

ต้องการให้ String มีขนาดคงที่ดังนั้นคุณสามารถใช้ pad หรือ truncate เพื่อจัดทำเป็น data ...

class Playground {
    private static String fixStrSize(String s, int n) {
        return String.format("%-" + n + "s", String.format("%." + n +"s", s));
    }

    public static void main(String[ ] args) {
        System.out.println("|"+fixStrSize("Hell",8)+"|");
        System.out.println("|"+fixStrSize("Hells Bells Java Smells",8)+"|");
    }
}

|Hell    |
|Hells Be|

การอ้างอิงที่ยอดเยี่ยมที่นี่


0

สิ่งนี้ใช้ได้ผลสำหรับฉันโดยไม่ต้องใช้ไลบรารีภายนอกใน Java 8

String sampleText = "test"
int n = 3;
String output = String.join("", Collections.nCopies(n, sampleText));
System.out.println(output);

และผลลัพธ์ก็คือ

testtesttest

0

int c = 10; ช่องว่างของสตริง = String.format ("%" + c + "c", ''); นี่จะช่วยแก้ปัญหาของคุณ


-1

วิธีการง่าย ๆ เช่นด้านล่างนี้ยังสามารถใช้ได้

public static String padString(String str, int leng,char chr) {
        for (int i = str.length(); i <= leng; i++)
            str += chr;
        return str;
    }

สิ่งนี้ช้าลงเล็กน้อย
slaks

คุณสามารถใช้ StringBuffer แทนการต่อสตริงในกรณีที่สตริงที่คุณจัดการมีขนาดใหญ่ ที่จะส่งผลกระทบต่อความเร็วอย่างมาก
Yashpal Singla

-2

แล้วเรื่องนี้ล่ะ

public String fillSpaces(int len) {
    /* the spaces string should contain spaces exceeding the max needed */  
    String spaces = "                                                   ";
    return spaces.substring(0,len);
}

แก้ไข: ฉันเขียนโค้ดง่าย ๆ เพื่อทดสอบแนวคิดและนี่คือสิ่งที่ฉันพบ

วิธีที่ 1: เพิ่มพื้นที่เดียวในลูป:

  public String execLoopSingleSpace(int len){
    StringBuilder sb = new StringBuilder();

    for(int i=0; i < len; i++) {
        sb.append(' ');
    }

    return sb.toString();
  }

วิธีที่ 2: ผนวก 100 ช่องว่างและวนรอบแล้วซับสตริง:

  public String execLoopHundredSpaces(int len){
    StringBuilder sb = new StringBuilder("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ");

    for (int i=0; i < len/100 ; i++) {
        sb.append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ");
    }

    return sb.toString().substring(0,len);
  }

ผลลัพธ์ที่ฉันได้รับสร้าง 12,345,678 ช่องว่าง:

C:\docs\Projects> java FillSpace 12345678
method 1: append single spaces for 12345678 times. Time taken is **234ms**. Length of String is 12345678
method 2: append 100 spaces for 123456 times. Time taken is **141ms**. Length of String is 12345678
Process java exited with code 0

และสำหรับ 10,000,000 พื้นที่:

C:\docs\Projects> java FillSpace 10000000
method 1: append single spaces for 10000000 times. Time taken is **157ms**. Length of String is 10000000
method 2: append 100 spaces for 100000 times. Time taken is **109ms**. Length of String is 10000000
Process java exited with code 0

การรวมการจัดสรรโดยตรงและการวนซ้ำมักใช้เวลาน้อยลงโดยเฉลี่ยน้อยกว่า 60ms เมื่อสร้างพื้นที่ขนาดใหญ่ สำหรับขนาดที่เล็กลงผลลัพธ์ทั้งสองจะเล็กน้อย

แต่โปรดแสดงความคิดเห็นต่อไป :-)


3
@ aznilamir: หืมม, คุณจะทำอย่างไรกับพื้นที่ 10k?
Jayan

แนวคิดคือการรวมลูปและการจัดสรรโดยตรง 100 ช่องว่าง นี่คือตัวอย่างโค้ด:
aznilamir

ทำไมคุณใช้หลายผนวกเพื่อเพิ่ม 100 ตัวอักษร? ทำไมไม่รวมถ่าน 100 อันล่ะ?
nycynik

-3

ฉันรู้ว่าไม่มีวิธีการในตัวสำหรับสิ่งที่คุณถาม อย่างไรก็ตามสำหรับความยาวคงที่ขนาดเล็กเช่น 10 วิธีการของคุณควรเร็วมาก


ถ้ามันมีความยาวคงที่เพียงเล็กน้อยเช่น 10
C. Ross
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.