ජාවා හි 'අරේලිස්ට් <ස්ට්‍රිං>' ස්ට්‍රිං [] 'බවට පරිවර්තනය කිරීම


1045

ජාවා හි ArrayList<String>වස්තුවක් String[]අරාවකට පරිවර්තනය කරන්නේ කෙසේද ?


2
යන මේ පිළිතුර කළ සමග යාවත්කාලීන ප්රවේශය සමඟ JDK-11 සඳහා නව සමාන performant API හඳුන්වා toArray(T[])වාග් රීතිය සහ ඒ හා සමාන කිරීමට Stream.toArray.
නාමන්

Answers:


1819
List<String> list = ..;
String[] array = list.toArray(new String[0]);

උදාහරණයක් වශයෙන්:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);

මෙම toArray()කිසිදු තර්කයක් ප්රතිලාභ සම්මත නොකර ක්රමය Object[]. එබැවින් ඔබට අරාව තර්කයක් ලෙස සම්මත කළ යුතු අතර එය ලැයිස්තුවේ දත්ත වලින් පුරවා ආපසු එනු ඇත. ඔබට හිස් අරාවක් ද පසු කළ හැකිය, නමුත් ඔබට අපේක්ෂිත ප්‍රමාණයෙන් අරාවක් ද සම්මත කළ හැකිය.

වැදගත් යාවත්කාලීන කිරීම : මුලින් ඉහත කේතය භාවිතා කරන ලදි new String[list.size()]. කෙසේ වෙතත්, මෙම බ්ලොග් පෝස්ට් එකෙන් හෙළි වන්නේ ජේවීඑම් ප්‍රශස්තිකරණය නිසා new String[0]දැන් භාවිතා කිරීම වඩා හොඳ බවයි.


16
තර්කයේ ප්‍රමාණයෙන් යම් වෙනසක් සිදු වේද?
Thorbj Rrn Ravn Andersen

37
එය තවත් එක් අරාජ්‍යතාවයක් ඉතිරි කරයි
බොෂෝ

62
ශුන්‍ය දිග අරාවක් සැපයීම, එය නිර්මාණය කිරීම සහ ඉවතලීම පවා නිවැරදි ප්‍රමාණයෙන් පෙළක් වෙන් කිරීමට වඩා සාමාන්‍යයෙන් වේගවත් බව හැරෙනවා. මිණුම් සලකුණු සහ පැහැදිලි කිරීම් සඳහා මෙහි බලන්න: shipilev.net/blog/2016/arrays-wisdom-ancients
ස්ටුවර්ට් ලකුණු

2
(. සමාවෙන්න Rhetorical ප්රශ්නය පිළිතුර ජාවා සැබෑ generics කරන්න නැති නිසා, ඇත්තෙන්ම, ය;. එය බොහෝ දුරට පමණක් වස්තූන් වාත්තු ඔවුන් fakes)
Nyerguds

3
@lyuboslavkanev ගැටළුව වන්නේ ජාවා හි සාමාන්‍ය වර්ගයක් තිබීම එම වර්ගය මත පදනම්ව වස්තූන් නිර්මාණය කිරීමට ප්‍රමාණවත් නොවීමයි; අරාව පවා නැත (එය හාස්‍යජනක ය, මන්ද එය ඕනෑම වර්ගයක වැඩ කළ යුතු බැවිනි ). මට පෙනෙන පරිදි එය සමඟ කළ හැකි සියල්ල වාත්තු කිරීමකි. ඇත්ත වශයෙන්ම, වර්ගයේ වස්තූන් නිර්මාණය කිරීමට පවා, ඔබට සත්‍ය Classවස්තුව තිබිය යුතුය, එය සාමාන්‍ය වර්ගයෙන් ව්‍යුත්පන්න කළ නොහැකි ය. මෙයට හේතුව, මා කී පරිදි, සම්පූර්ණ ඉදිකිරීම් ව්‍යාජ ය; ඒ සියල්ල අභ්‍යන්තරව වස්තුවක් ලෙස ගබඩා කර ඇත.
නයර්ගුඩ්ස්

178

ජාවා 8 හි විකල්පයක්:

String[] strings = list.stream().toArray(String[]::new);

ජාවා 11+:

String[] strings = list.toArray(String[]::new);

25
නැත්නම් යම් ප්‍රතිලාභයක් තිබේද?
ජේම්ස් වොට්කින්ස්

1
මම එම සින්ටැක්ස් වලට කැමතියි, නමුත් ඉන්ටෙලිජේ ඒ සමඟ සම්පාදක දෝෂයක් පෙන්වයි, "ටී [] ක්‍රියාකාරී අතුරු මුහුණතක් නොවේ" යනුවෙන් පැමිණිලි කරයි.
ග්ලෙන් මැසා

3
@ ග්ලෙන්මාසා ඔබට භාවිතා කළ හැක්කේ වස්තුවක් toArrayමත පමණි Stream. ඔබ a භාවිතා කරමින් ධාරාව අඩු Collectorsකර අයදුම් කිරීමට උත්සාහ කළහොත් මෙම සම්පාදක දෝෂය ඇතිවිය හැකිය toArray.
උදාරා

40

ඔබට මෙම toArray()ක්‍රමය භාවිතා කළ හැකිය List:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);

නැතහොත් ඔබට අරා වලට මූලද්‍රව්‍ය අතින් එකතු කළ හැකිය:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}

මෙය උපකාරී වේ යැයි සිතමු!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

CopyOf භාවිතා කරමින්, අරා වෙත අරා ලැයිස්තු ද කළ හැකිය.


4
ඔටුවන් පෙට්ටිය යෝජනා කරන්න "objectList = ..." සහ "stringArray". එසේම, එය Arrays.copyOf ... කැපිටල් ඕ.
ජේසන් වෙඩන්

1
list.toArray () අභ්‍යන්තරව භාවිතා කරන්නේ Arrays.copyOf ()
ඩේවිඩ්

28

ජාවා -11 සිට ඇරඹෙන කෙනෙකුට විකල්පයක් ලෙස ඒපීඅයි භාවිතා කළ හැකිය Collection.toArray(IntFunction<T[]> generator).

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray

10

ජාවා 8 හි:

String[] strings = list.parallelStream().toArray(String[]::new);

12
මෙය සැබවින්ම දැනටමත් මෙම පිළිතුරෙහි අඩංගු වේ . සමහර විට එය සම්පූර්ණයෙන්ම නව පිළිතුරක් වෙනුවට එම පිළිතුරට සංස්කරණයක් ලෙස එක් කරන්න.
ගංගාව

11
parallelStream()සරලව වෙනුවට ඇයි stream()?
යූරි එන්.

7

ජාවා 8 හි එය භාවිතයෙන් කළ හැකිය

String[] arrayFromList = fromlist.stream().toArray(String[]::new);

6

ඔබගේ යෙදුම දැනටමත් Apache Commons lib භාවිතා කරන්නේ නම්, සෑම විටම නව හිස් අරාවක් නිර්මාණය නොකිරීමට ඔබට පිළිගත් පිළිතුර තරමක් වෙනස් කළ හැකිය:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);

විවිධ වර්ගවල පූර්ව වෙන්කර ඇති හිස් අරා කිහිපයක් තිබේ ArrayUtils.

මේ ආකාරයෙන් අපට හිස් අරා නිර්මාණය කිරීම සඳහා ජේවීඑම් වංචා කළ හැකිය:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());

නමුත් මේ ආකාරයෙන් කිසිදු වාසියක් නැත, රසය පිළිබඳ කාරණයක්, IMO.


6

Iterator<String>මෙහි මූලද්‍රව්‍ය නැවත සැකසීමට ඔබට භාවිතා කළ හැකිය ArrayList<String>:

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}

දැන් ඔබට ඕනෑම ලූපයක් String[]භාවිතා කිරීමෙන් මූලද්‍රව්‍ය ලබා ගත හැකිය .


මම පහත හෙලූයේ: 1. ඔබට බල කරන ජනකතා භාවිතා .toString()නොකිරීම 2. පැහැදිලි වාත්තු කිරීමක් අවශ්‍ය නොවන තැන භාවිතා කිරීම, 3. ඔබ වැඩි නොකරන්න i, සහ 4. whileආදේශ කිරීමෙන් වඩා හොඳ වනු ඇත for. යෝජිත කේතය:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
ඔලිවියර් ග්‍රෙගෝයර්

හරි, මට දැන් තේරුණා. ස්තූතියි.
වට්සාල් චව්ඩා

හොඳයි, ඉතා මැනවින්, එම අදහස් ඇතුළත් කිරීම සඳහා ඔබ ඔබේ කේතය සංස්කරණය කළ යුතුය (එනම් ... ඔබේ පිළිතුරට ඒවා හොඳ යැයි ඔබ සිතන්නේ නම්!). කේතය නොවෙනස්ව පවතින අතර මගේ පහත් අගය ඉවත් කිරීම ගැන මම නොසිතමි.
ඔලිවියර් ග්‍රෙගෝයර්

මම මෙහි අලුත් ය, එබැවින් මෙහි දේවල් ක්‍රියාත්මක වන්නේ කෙසේදැයි මම තවමත් නොදනිමි. ඔබේ සහකරු හෝ සහකාරිය අගය කරන්න.
වට්සාල් චව්ඩා

මෙය වඩා හොඳය! මම ටිකක් සංස්කරණය කර ඇත, නමුත් එය ක්‍රියාත්මක වන ආකාරය ඔබ අත්විඳ ඇත: පිළිතුර සැපයීම, ඒවා වැඩිදියුණු කිරීම, සම්මාන ලබා ගැනීම;)
ඔලිවියර් ග්‍රෙගෝයර්

6

ඕනෑම List<Type>දෙයක් සඟවා තැබීමට ජනක විසඳුම String []:

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}

සටහන ඔබ override toString()ක්‍රමවේදය කළ යුතුය .

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
මෙය ක්‍රියාත්මක වන නමුත් සුපිරි කාර්යක්ෂම නොවන අතර පිළිගත් පිළිතුරෙහි ක්‍රියාකාරීත්වය අතිරේක කේත සමඟ අනුපිටපත් කරයි.
ඇලන් ඩෙලිමන්

5

පරිශීලකයාට ශ්‍රිතයක් අවශ්‍ය වන දත්තවල අමතර හැසිරවීමක් අවශ්‍ය නම්, මෙම ප්‍රවේශය පරිපූර්ණ නොවේ (මූලද්‍රව්‍යයේ පන්තිය දෙවන පරාමිතිය ලෙස සම්මත කිරීම අවශ්‍ය බැවින්), නමුත් ක්‍රියා කරයි:

ආනයනය java.util.ArrayList; ආනයනය java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}


4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

අදහස් දැක්වීමකට, පරිවර්තනය ක්‍රියාත්මක වන ආකාරය පැහැදිලි කිරීම සඳහා මම ඡේදයක් එක් කළෙමි. පළමුව, ලැයිස්තුව සංගීත ප්‍රවාහයක් බවට පරිවර්තනය වේ. ඉන්පසු එය ධාරාවේ මූලද්‍රව්‍ය අරාව බවට පරිවර්තනය කිරීම සඳහා Stream.toArray භාවිතා කරයි. "ප්‍රමාණය -> නව නූල් [ප්‍රමාණය]" ට ඉහළින් ඇති අවසාන ප්‍රකාශයේ ඇත්ත වශයෙන්ම ඉන්ටර්ෆන්ෂන් ශ්‍රිතයකි. ප්රකාශය සමාන වේ

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
මෙම පිළිතුරෙන් එකතු වන වටිනාකම කුමක්ද? එය ප්‍රශ්නයට පිළිතුරු දෙන්නේ මන්දැයි පැහැදිලි නොකර වෙනත් පිළිතුරු පුනරාවර්තනය කරන බවක් පෙනේ.
රිචඩ්

2

මෙම ක්‍රමය භාවිතා කිරීමෙන් ඔබට ලැයිස්තුවට සංගීත අරා බවට පරිවර්තනය කළ හැකිය:

 Object[] stringlist=list.toArray();

සම්පූර්ණ උදාහරණය:

ArrayList<String> list=new ArrayList<>();
    list.add("Abc");
    list.add("xyz");

    Object[] stringlist=list.toArray();

    for(int i = 0; i < stringlist.length ; i++)
    {
          Log.wtf("list data:",(String)stringlist[i]);
    }

1
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
    String[] delivery = new String[deliveryServices.size()];
    for (int i = 0; i < deliveryServices.size(); i++) {
        delivery[i] = deliveryServices.get(i).getName();
    }
    return delivery;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.