วิธีที่ง่ายที่สุดในการคั่นรายการด้วยลูกน้ำ?


104

วิธีใดเป็นวิธีที่ชัดเจนที่สุดในการคั่นรายการด้วยจุลภาคใน Java

ฉันรู้วิธีการทำหลายวิธี แต่ฉันสงสัยว่าวิธีที่ดีที่สุดคืออะไร (โดยที่คำว่า "ดีที่สุด" หมายถึงชัดเจนที่สุดและ / หรือสั้นที่สุดไม่ใช่วิธีที่มีประสิทธิภาพสูงสุด

ฉันมีรายการและต้องการวนซ้ำโดยพิมพ์แต่ละค่า ฉันต้องการพิมพ์เครื่องหมายจุลภาคระหว่างแต่ละรายการ แต่ไม่ใช่หลังรายการสุดท้าย (หรือก่อนรายการแรก)

List --> Item ( , Item ) *
List --> ( Item , ) * Item

ตัวอย่างโซลูชัน 1:

boolean isFirst = true;
for (Item i : list) {
  if (isFirst) {
    System.out.print(i);        // no comma
    isFirst = false;
  } else {
    System.out.print(", "+i);   // comma
  }
}

ตัวอย่างโซลูชัน 2 - สร้างรายการย่อย:

if (list.size()>0) {
  System.out.print(list.get(0));   // no comma
  List theRest = list.subList(1, list.size());
  for (Item i : theRest) {
    System.out.print(", "+i);   // comma
  }
}

ตัวอย่างโซลูชัน 3:

  Iterator<Item> i = list.iterator();
  if (i.hasNext()) {
    System.out.print(i.next());
    while (i.hasNext())
      System.out.print(", "+i.next());
  }

สิ่งเหล่านี้ปฏิบัติต่อรายการแรกเป็นพิเศษ หนึ่งสามารถปฏิบัติแทนคนสุดท้ายเป็นพิเศษ

อนึ่งนี่คือวิธีที่List toString จะดำเนินการ (มันสืบทอดมาจากAbstractCollection) ในชวา 1.6:

public String toString() {
    Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
            return sb.append(']').toString();
        sb.append(", ");
    }
}

มันออกจากลูปก่อนกำหนดเพื่อหลีกเลี่ยงเครื่องหมายจุลภาคหลังรายการสุดท้าย BTW: นี่เป็นครั้งแรกที่ฉันจำได้ว่าเห็น "(คอลเลคชันนี้)"; นี่คือรหัสที่จะกระตุ้นมัน:

List l = new LinkedList();
l.add(l);
System.out.println(l);

ฉันยินดีต้อนรับโซลูชันใด ๆ แม้ว่าพวกเขาจะใช้ไลบรารีที่ไม่คาดคิด (regexp?); และโซลูชันในภาษาอื่นที่ไม่ใช่ Java (เช่นฉันคิดว่า Python / Ruby มีฟังก์ชันสลับกัน - วิธีการใช้งานนั้นเป็นอย่างไร)

ชี้แจง : โดยไลบรารีฉันหมายถึงไลบรารี Java มาตรฐาน สำหรับไลบรารีอื่น ๆ ฉันถือว่าเป็นภาษาอื่น ๆ และสนใจที่จะทราบว่ามีการนำไปใช้อย่างไร

ชุดเครื่องมือแก้ไขกล่าวถึงคำถามที่คล้ายกัน: การทำซ้ำครั้งล่าสุดของการปรับปรุงสำหรับการวนซ้ำใน java

และอีกอย่าง: องค์ประกอบสุดท้ายในลูปสมควรได้รับการรักษาแยกกันหรือไม่?


คำตอบ:


226

Java 8 และใหม่กว่า

ใช้StringJoinerคลาส:

StringJoiner joiner = new StringJoiner(",");
for (Item item : list) {
    joiner.add(item.toString());
}
return joiner.toString();

การใช้StreamและCollectors:

return list.stream().
       map(Object::toString).
       collect(Collectors.joining(",")).toString();

Java 7 และรุ่นก่อนหน้า

ดู# 285523 ด้วย

String delim = "";
for (Item i : list) {
    sb.append(delim).append(i);
    delim = ",";
}

1
วิธีที่น่าแปลกใจมากในการจัดเก็บสถานะ! มันเกือบจะเป็นรูปแบบ OO ฉันไม่ชอบการมอบหมายงานที่ไม่จำเป็นในทุกๆลูป แต่ฉันพนันได้เลยว่ามันมีประสิทธิภาพมากกว่า if วิธีแก้ปัญหาส่วนใหญ่ทำซ้ำการทดสอบที่เรารู้ว่าไม่เป็นความจริงแม้ว่าจะไม่มีประสิทธิภาพ แต่ก็อาจเป็นวิธีที่ชัดเจนที่สุด ขอบคุณสำหรับลิงค์!
13

1
ฉันชอบสิ่งนี้ แต่เพราะมันฉลาดและน่าประหลาดใจฉันจึงคิดว่ามันไม่เหมาะสมที่จะใช้ (น่าแปลกใจที่ไม่ดี!) อย่างไรก็ตามฉันไม่สามารถช่วยตัวเองได้ ฉันยังไม่แน่ใจเกี่ยวกับเรื่องนี้ อย่างไรก็ตามมันสั้นมากจนง่ายต่อการออกกำลังกายหากมีความคิดเห็นที่จะแนะนำคุณ
13

6
@ 13ren: คุณกับลุงบ๊อบต้องคุยกันเรื่องรหัสที่ "ฉลาดและน่าประหลาดใจ"
Stefan Kendall

ฉันรู้สึกเสียเวลาไปหลายปีที่ไม่รู้เรื่องนี้ ^^;
ทะเลสาบ

ทำไม Java ถึงต้องเปลี่ยนงานดังกล่าวให้กลายเป็นโค้ดที่น่าเกลียด?
Eduardo

82
org.apache.commons.lang3.StringUtils.join(list,",");

1
พบแหล่งที่มา: svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/…เมธอด join มี 9 โอเวอร์โหลด ตัวที่ใช้การวนซ้ำจะเหมือนกับ "ตัวอย่างโซลูชัน 3"; สิ่งที่อิงดัชนีใช้: if (i> startIndex) {<add Separator>}
13ren

ฉันหลังจากการใช้งานจริงๆ เป็นความคิดที่ดีที่จะรวมไว้ในฟังก์ชัน แต่ในทางปฏิบัติบางครั้งตัวคั่นของฉันก็ขึ้นบรรทัดใหม่และแต่ละบรรทัดจะเยื้องไปยังความลึกที่ระบุด้วย เว้นแต่ ... เข้าร่วม (รายการ "\ n" + เยื้อง) ... จะได้ผลเสมอไปหรือไม่ ขออภัยเพียงแค่คิดดัง ๆ
13

2
ในความคิดของฉันนี่เป็นทางออกที่สวยที่สุดและสั้นที่สุด
Jesper Rønn-Jensen

น่าจะ list.iterator ()?
Vanuan

32

Java 8 มีวิธีการใหม่ ๆ ในการดำเนินการนี้:

  • วิธีการในการjoinString
  • ตัวjoiningรวบรวมสตรีมจากCollectorsคลาส
  • StringJoinerระดับ

ตัวอย่าง:

// Util method for strings and other char sequences
List<String> strs = Arrays.asList("1", "2", "3");
String listStr1 = String.join(",", strs);

// For any type using streams and collectors
List<Object> objs = Arrays.asList(1, 2, 3);
String listStr2 = objs.stream()
    .map(Object::toString)
    .collect(joining(",", "[", "]"));

// Using the new StringJoiner class
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.setEmptyValue("<empty>");
for (Integer i : objs) {
  joiner.add(i.toString());
}
String listStr3 = joiner.toString();

import static java.util.stream.Collectors.joining;วิธีการใช้กระแสถือว่า


นี่คือ IMHO หากคุณใช้ java 8 คำตอบที่ดีที่สุด
scravy


7

หากคุณใช้ Spring Framework คุณสามารถทำได้ด้วยStringUtils :

public static String arrayToDelimitedString(Object[] arr)
public static String arrayToDelimitedString(Object[] arr, String delim)
public static String collectionToCommaDelimitedString(Collection coll)
public static String collectionToCommaDelimitedString(Collection coll, String delim)

ขอบคุณ แต่จะใช้งานอย่างไร?
13

6

ขึ้นอยู่กับการใช้งาน List toString ของ Java:

Iterator i = list.iterator();
for (;;) {
  sb.append(i.next());
  if (! i.hasNext()) break;
  ab.append(", ");
}

มันใช้ไวยากรณ์ดังนี้:

List --> (Item , )* Item

ด้วยการใช้แบบ Last-based แทนที่จะเป็น First-based ก็สามารถตรวจสอบ Skip-comma ด้วยการทดสอบเดียวกันเพื่อตรวจสอบ end-of-list ฉันคิดว่าอันนี้สวยมาก แต่ฉันไม่แน่ใจในความชัดเจน



4

มีวิธีที่ดีในการบรรลุสิ่งนี้โดยใช้ Java 8:

List<String> list = Arrays.asList(array);
String joinedString = String.join(",", list);

TextUtils.join (",", รายการ);
Arul Pandian

3
for(int i=0, length=list.size(); i<length; i++)
  result+=(i==0?"":", ") + list.get(i);

ใช่มันค่อนข้างคลุมเครือ แต่เป็นทางเลือกสำหรับสิ่งที่โพสต์ไปแล้ว
cherouvim

1
ฉันคิดว่ารหัสดูดี IMHO สวยกว่าคำตอบอื่น ๆ ของคุณและมันแทบจะไม่ 'คลุมเครือ' สรุปด้วยวิธีการที่เรียกว่าเข้าร่วมและการหัวเราะของคุณฉันยังคงคาดหวังว่าภาษาจะมีวิธีที่ดีกว่าในการแก้ปัญหาที่พบบ่อย
tarn

@tarn: คุณคิดว่ามันดูดีเพราะคุณมีพื้นหลัง Python / perl;) ฉันชอบมันเช่นกัน
cherouvim

3

ทางเลือกหนึ่งสำหรับ foreach loop คือ:

StringBuilder sb = new StringBuilder();
for(String s:list){
  if (sb.length()>0) sb.append(",");
  sb.append(s);
}

2
StringBuffer result = new StringBuffer();
for(Iterator it=list.iterator; it.hasNext(); ) {
  if (result.length()>0)
    result.append(", ");
  result.append(it.next());
}

อัปเดต : ตามที่ Dave Webb กล่าวไว้ในความคิดเห็นสิ่งนี้อาจให้ผลลัพธ์ที่ไม่ถูกต้องหากรายการแรกในรายการเป็นสตริงว่างเปล่า


meh .. ยังมี if อยู่ในวง
sfossen

คุณสามารถใช้ foreach loop เพื่อทำให้สั้นลง
Peter Lawrey

จะใช้ไม่ได้หากรายการแรกในรายการเป็นสตริงว่าง
Dave Webb

@ Dave Webb: ใช่ขอบคุณ คำถามนี้ไม่มีข้อกำหนดดังกล่าว
cherouvim

@cherovium: คำถามไม่ได้บอกว่าไม่มีรายการใดที่จะเป็นสตริงว่างดังนั้นจึงเป็นข้อกำหนดโดยปริยาย หากคุณกำลังสร้างช่องว่างของไฟล์ CSV อาจเป็นเรื่องธรรมดา
Dave Webb

2

ฉันมักจะทำสิ่งนี้:

StringBuffer sb = new StringBuffer();
Iterator it = myList.iterator();
if (it.hasNext()) { sb.append(it.next().toString()); }
while (it.hasNext()) { sb.append(",").append(it.next().toString()); }

แม้ว่าฉันคิดว่าฉันจะตรวจสอบนี้จากนี้ไปตามการใช้งาน Java;)


นั่นเป็นตรรกะเดียวกับตัวอย่างที่ 3 ฉันชอบเพราะมันไม่ได้ทำอะไรที่ไม่จำเป็น อย่างไรก็ตามฉันไม่รู้ว่ามันชัดเจนที่สุดหรือเปล่า BTW: จะมีประสิทธิภาพมากกว่าเล็กน้อยหากคุณใส่ while ไว้ใน if โดยหลีกเลี่ยงการทดสอบสองครั้งเมื่อรายการว่างเปล่า นอกจากนี้ยังทำให้ชัดเจนขึ้นสำหรับฉัน
13

เพื่อประโยชน์ในสวรรค์ใช้ StringBuilder
scravy

2

หากคุณสามารถใช้ Groovy (ซึ่งทำงานบน JVM):

def list = ['a', 'b', 'c', 'd']
println list.join(',')

ขอบคุณ แต่ฉันสนใจในการใช้งาน วิธีนี้ใช้งานอย่างไร?
13

2

(คัดลอกคำตอบของฉันเองจากที่นี่ ) วิธีแก้ปัญหาหลายอย่างที่อธิบายไว้ที่นี่เป็นวิธีแก้ปัญหาด้านบนเล็กน้อย IMHO โดยเฉพาะอย่างยิ่งที่ต้องใช้ไลบรารีภายนอก มีสำนวนที่ดีและชัดเจนสำหรับการบรรลุรายการที่คั่นด้วยจุลภาคที่ฉันใช้มาตลอด มันขึ้นอยู่กับตัวดำเนินการเงื่อนไข (?):

แก้ไข : โซลูชันดั้งเดิมถูกต้อง แต่ไม่เหมาะสมตามความคิดเห็น ลองครั้งที่สอง:

int[] array = {1, 2, 3};
StringBuilder builder = new StringBuilder();
for (int i = 0 ;  i < array.length; i++)
       builder.append(i == 0 ? "" : ",").append(array[i]);

เอาล่ะในโค้ด 4 บรรทัดรวมถึงการประกาศอาร์เรย์และ StringBuilder

แก้ไขครั้งที่ 2 : หากคุณกำลังติดต่อกับ Iterator:

    List<Integer> list = Arrays.asList(1, 2, 3);
    StringBuilder builder = new StringBuilder();
    for (Iterator it = list.iterator(); it.hasNext();)
        builder.append(it.next()).append(it.hasNext() ? "," : "");

สิ่งนี้และstackoverflow.com/questions/668952/…ข้างบนนี้คล้ายกัน มันสั้นและชัดเจน แต่ถ้าคุณมีเพียงตัววนซ้ำคุณต้องแปลงก่อน ไม่มีประสิทธิภาพ แต่อาจคุ้มค่าสำหรับความชัดเจนของแนวทางนี้หรือไม่?
13

ฮึการต่อสายอักขระสร้าง StringBuilder ชั่วคราวภายในการใช้ StringBuilder ไม่มีประสิทธิภาพ ดีกว่า (ชอบ Java มากกว่า แต่โค้ดที่รันได้ดีกว่า) จะเป็น "if (i> 0) {builder.append (',');}" ตามด้วย builder.append (array [i]);
Eddie

ใช่ถ้าคุณดูใน bytecode คุณพูดถูก ฉันไม่อยากเชื่อเลยว่าคำถามง่ายๆแบบนี้จะซับซ้อนขนาดนี้ ฉันสงสัยว่าคอมไพเลอร์สามารถปรับให้เหมาะสมได้หรือไม่
Julien Chastang

ให้ครั้งที่ 2 หวังว่าจะเป็นทางออกที่ดีกว่า
Julien Chastang

อาจจะดีกว่าที่จะแยกพวกเขา (เพื่อให้ผู้คนสามารถโหวตได้อย่างใดอย่างหนึ่ง)
13

1

ฉันมักจะใช้สิ่งที่คล้ายกับเวอร์ชัน 3 มันทำงานได้ดี c / c ++ / bash / ... : P


1

ฉันไม่ได้รวบรวมมัน ... แต่ควรจะทำงาน (หรือใกล้จะทำงาน)

public static <T> String toString(final List<T> list, 
                                  final String delim)
{
    final StringBuilder builder;

    builder = new StringBuilder();

    for(final T item : list)
    {
        builder.append(item);
        builder.append(delim);
    }

    // kill the last delim
    builder.setLength(builder.length() - delim.length());

    return (builder.toString());
}

ฉันชอบวิธีนี้ฉันแค่ต้องการรูปแบบอื่น แต่จะกล่าวถึงการแก้ไขเล็ก ๆ อย่างหนึ่ง: หากรายการว่างเปล่าสิ่งนี้จะทำให้เกิดข้อยกเว้น IndexOutOfBounds ดังนั้นให้ทำการตรวจสอบก่อน setLength หรือใช้ Math.max (0, ... )
tb-

1

นี่สั้นมากชัดเจนมาก แต่ให้ความรู้สึกที่น่าสะพรึงกลัวของฉัน การปรับให้เข้ากับตัวคั่นที่แตกต่างกันเป็นเรื่องที่ค่อนข้างอึดอัดโดยเฉพาะอย่างยิ่งถ้า String (ไม่ใช่ตัวอักษร)

for (Item i : list)
  sb.append(',').append(i);
if (sb.charAt(0)==',') sb.deleteCharAt(0);

แรงบันดาลใจจาก: การทำซ้ำครั้งสุดท้ายของการปรับปรุงสำหรับการวนซ้ำใน java


1
StringBuffer sb = new StringBuffer();

for (int i = 0; i < myList.size(); i++)
{ 
    if (i > 0) 
    {
        sb.append(", ");
    }

    sb.append(myList.get(i)); 
}

ฉันพบว่าอันนี้ง่ายมากที่จะฝังลงในคลาสยูทิลิตี้แบบคงที่ในขณะที่อ่านและเข้าใจได้ง่ายมากเช่นกัน นอกจากนี้ยังไม่ต้องการตัวแปรหรือสถานะเพิ่มเติมใด ๆ นอกเหนือจากรายการเองลูปและตัวคั่น
Joachim H. Skeie

สิ่งนี้จะให้สิ่งต่างๆเช่น:Item1Item2, Item3, Item4,

เพื่อประโยชน์สวรรค์ให้ใช้ StringBuilder
scravy

1

ฉันค่อนข้างชอบแนวทางนี้ซึ่งฉันพบในบล็อกเมื่อไม่นานมานี้ ขออภัยฉันจำชื่อ / URL ของบล็อกไม่ได้

คุณสามารถสร้างคลาสยูทิลิตี้ / ตัวช่วยที่มีลักษณะดังนี้:

private class Delimiter
{
    private final String delimiter;
    private boolean first = true;

    public Delimiter(String delimiter)
    {
        this.delimiter = delimiter;
    }

    @Override
    public String toString()
    {
        if (first) {
            first = false;
            return "";
        }

        return delimiter;
    }
}

การใช้คลาสตัวช่วยทำได้ง่ายๆดังนี้:

StringBuilder sb = new StringBuilder();
Delimiter delimiter = new Delimiter(", ");

for (String item : list) {
    sb.append(delimiter);
    sb.append(item);
}

หมายเหตุ: ควรเป็น "ตัวคั่น" ไม่ใช่ "ตัวคั่น"
Michael Myers

1

เนื่องจากตัวคั่นของคุณคือ "," คุณสามารถใช้สิ่งต่อไปนี้:

public class StringDelim {

    public static void removeBrackets(String string) {
        System.out.println(string.substring(1, string.length() - 1));
    }

    public static void main(String... args) {
        // Array.toString() example
        String [] arr = {"Hi" , "My", "name", "is", "br3nt"};
        String string = Arrays.toString(arr);
        removeBrackets(string);

        // List#toString() example
        List<String> list = new ArrayList<String>();
        list.add("Hi");
        list.add("My");
        list.add("name");
        list.add("is");
        list.add("br3nt");
        string = list.toString();
        removeBrackets(string);

        // Map#values().toString() example
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("1", "Hi");
        map.put("2", "My");
        map.put("3", "name");
        map.put("4", "is");
        map.put("5", "br3nt");
        System.out.println(map.values().toString());
        removeBrackets(string);

        // Enum#toString() example
        EnumSet<Days> set = EnumSet.allOf(Days.class);
        string = set.toString();
        removeBrackets(string);
    }

    public enum Days {
        MON("Monday"),
        TUE("Tuesday"),
        WED("Wednesday"),
        THU("Thursday"),
        FRI("Friday"),
        SAT("Saturday"),
        SUN("Sunday");

        private final String day;

        Days(String day) {this.day = day;}
        public String toString() {return this.day;}
    }
}

หากตัวคั่นของคุณเป็นอย่างอื่นสิ่งนี้จะไม่ได้ผลสำหรับคุณ


1

ฉันชอบวิธีนี้:

String delim = " - ", string = "";

for (String item : myCollection)
    string += delim + item;

string = string.substring(delim.length());

ฉันคิดว่ามันสามารถใช้ประโยชน์จาก StringBuilder ได้เช่นกัน


1

ในความคิดของฉันนี่เป็นวิธีที่ง่ายที่สุดในการอ่านและทำความเข้าใจ:

StringBuilder sb = new StringBuilder();
for(String string : strings) {
    sb.append(string).append(',');
}
sb.setLength(sb.length() - 1);
String result = sb.toString();

0

ใน Python เป็นเรื่องง่าย

",". เข้าร่วม (รายการของคุณ)

ใน C # มีวิธีการแบบคงที่ในคลาส String

String.Join (",", yourlistofstrings)

ขออภัยไม่แน่ใจเกี่ยวกับ Java แต่คิดว่าฉันจะพูดต่อเมื่อคุณถามเกี่ยวกับภาษาอื่น ฉันแน่ใจว่าจะมีอะไรที่คล้ายกันใน Java


IIRC คุณจะได้รับการต่อท้ายในเวอร์ชัน. Net :-(

1
เพิ่งทดสอบไม่มีตัวคั่นท้ายใน. NET หรือ Python
tarn

1
ขอบคุณ! ฉันพบแหล่งที่มาของมัน: svn.python.org/view/python/branches/release22-branch/Objects/… ค้นหา "Catenate everything" จะละเว้นตัวคั่นสำหรับรายการสุดท้าย
13

@ 13ren ทำได้ดีมาก! มันช่วย? ฉันมีล็อคและจำได้อย่างรวดเร็วว่าทำไมฉันเลือกที่จะไม่เขียนโปรแกรมใน C วันนี้: P
tarn

@tarn ใช่มันเป็นตัวอย่างที่น่าสนใจเพราะมันจะเพิ่มคอมแมนก็ต่อเมื่อไม่ใช่รายการสุดท้าย: if (i <seqlen - 1) {<add Separator>}
13ren

0

คุณยังสามารถเพิ่มสตริงตัวคั่นโดยไม่มีเงื่อนไขและหลังจากวนซ้ำแล้วให้ลบตัวคั่นพิเศษที่ส่วนท้าย จากนั้น "ถ้ารายการว่างให้ส่งคืนสตริงนี้" ที่จุดเริ่มต้นจะช่วยให้คุณหลีกเลี่ยงการตรวจสอบในตอนท้าย (เนื่องจากคุณไม่สามารถลบอักขระออกจากรายการว่างได้)

ดังนั้นคำถามคือ:

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


0
public static String join (List<String> list, String separator) {
  String listToString = "";

  if (list == null || list.isEmpty()) {
   return listToString;
  }

  for (String element : list) {
   listToString += element + separator;
  }

  listToString = listToString.substring(0, separator.length());

  return listToString;
}

1
ฉันคิดว่าคุณควรจะพูดlistToString.substring(0, listToString.length()-separator.length());
13 เรน

0
if (array.length>0)          // edited in response Joachim's comment
  sb.append(array[i]);
for (int i=1; i<array.length; i++)
  sb.append(",").append(array[i]);

ขึ้นอยู่กับวิธีที่ชัดเจนที่สุดในการคั่นรายการด้วยจุลภาค (Java)?

ใช้แนวคิดนี้: องค์ประกอบสุดท้ายในลูปสมควรได้รับการรักษาแยกกันหรือไม่?


1
เพื่อให้ใช้งานได้คุณต้องทราบว่ามีอย่างน้อย 1 องค์ประกอบในรายการมิฉะนั้น for-loop แรกของคุณจะขัดข้องกับ IndexOutOfBoundsException
Joachim H. Skeie

@ Joachim ขอบคุณคุณพูดถูกแน่นอน ช่างเป็นทางออกที่น่าเกลียดจริงๆ! ฉันจะเปลี่ยนfor (int i=0; i<1; i++)เป็นif (array.length>0).
13

0
public String toString(List<Item> items)
{
    StringBuilder sb = new StringBuilder("[");

    for (Item item : items)
    {
        sb.append(item).append(", ");
    }

    if (sb.length() >= 2)
    {
        //looks cleaner in C# sb.Length -= 2;
        sb.setLength(sb.length() - 2);
    }

    sb.append("]");

    return sb.toString();
}

1
เพิ่งสังเกตว่ามันคล้ายกับคำตอบที่TofuBeer ให้ไว้
Eblis

0

ไม่มีคำตอบใดที่ใช้การเรียกซ้ำเลย ...

public class Main {

    public static String toString(List<String> list, char d) {
        int n = list.size();
        if(n==0) return "";
        return n > 1 ? Main.toString(list.subList(0, n - 1), d) + d
                  + list.get(n - 1) : list.get(0);
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList(new String[]{"1","2","3"});
        System.out.println(Main.toString(list, ','));
    }

}


-1

วิธี

String join(List<Object> collection, String delimiter){
    StringBuilder stringBuilder = new StringBuilder();
    int size = collection.size();
    for (Object value : collection) {
        size --;
        if(size > 0){
            stringBuilder.append(value).append(delimiter);
        }
    }

    return stringBuilder.toString();
}

การใช้งาน

รับอาร์เรย์ของ [1,2,3]

join(myArray, ",") // 1,2,3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.