2013-01-10 36 views
26

Có thể thêm chuỗi vào đầu chuỗi String mà không cần lặp lại toàn bộ mảng hay không.Thêm chuỗi vào đầu mảng String

+0

Sử dụng một cấu trúc dữ liệu khác nhau phù hợp với nhu cầu của bạn (ví dụ 'ArrayList') sẽ tốt hơn. – Sulthan

+1

Sử dụng ArrayUtils.add (T [] mảng, chỉ mục int, phần tử T) (https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils. html # add-T: A-int-T-) –

Trả lời

20

Cách duy nhất để làm điều này là để duy trì một vòng đệm. nghĩa là bạn có một bộ đếm ghi nhớ nơi bắt đầu và bạn di chuyển nó thay vì di chuyển tất cả các mục trong mảng. Điều này chỉ hoạt động bởi vì bạn xác định lại những gì "bắt đầu" có nghĩa là.

Xem nguồn cho ArrayDeque trong đó có ba lĩnh vực

86  /** 
    87  * The array in which the elements of the deque are stored. 
    88  * The capacity of the deque is the length of this array, which is 
    89  * always a power of two. The array is never allowed to become 
    90  * full, except transiently within an addX method where it is 
    91  * resized (see doubleCapacity) immediately upon becoming full, 
    92  * thus avoiding head and tail wrapping around to equal each 
    93  * other. We also guarantee that all array cells not holding 
    94  * deque elements are always null. 
    95  */ 
    96  private transient E[] elements; 
    97 
    98  /** 
    99  * The index of the element at the head of the deque (which is the 
    100  * element that would be removed by remove() or pop()); or an 
    101  * arbitrary number equal to tail if the deque is empty. 
    102  */ 
    103  private transient int head; 
    104 
    105  /** 
    106  * The index at which the next element would be added to the tail 
    107  * of the deque (via addLast(E), add(E), or push(E)). 
    108  */ 
    109  private transient int tail; 

Vì vậy, thêm vào khi bắt đầu làm việc như thế này

224  public void addFirst(E e) { 
    225   if (e == null) 
    226    throw new NullPointerException(); 
    227   elements[head = (head - 1) & (elements.length - 1)] = e; 
    228   if (head == tail) 
    229    doubleCapacity(); 
    230  } 


    312  /** 
    313  * @throws NoSuchElementException {@inheritDoc} 
    314  */ 
    315  public E getFirst() { 
    316   E x = elements[head]; 
    317   if (x == null) 
    318    throw new NoSuchElementException(); 
    319   return x; 
    320  } 

Lưu ý: nó di chuyển người đứng đầu chứ không phải là thay đổi tất cả các yếu tố xuống mảng .

+0

Tôi rất tò mò. Bạn có thể làm điều đó với độ dài vòng không được gắn? Bạn có một số giả mã giả không? – Jerome

+0

@Jerome Đã thêm mã từ ArrayDeque không được sửa. Nó tăng gấp đôi kích thước của mảng khi cần thiết. –

4

Bạn không thể ... Bạn phải di chuyển tất cả các chuỗi đến sau khi nó chuyển tiếp để chứa chuỗi mới. Nếu bạn trực tiếp thêm nó vào chỉ mục thứ 0, bạn sẽ mất phần tử trước đó tại đó

1

Để làm điều đó, bạn nên sử dụng List.

Và nếu bạn muốn sử dụng đặc biệt là các mảng nội bộ, đi cho một ArrayList

+0

Bạn không thể thực hiện getFirst (...), getLast (...), addFirst (...), addLast (...), removeFirst (.. .), hoặc removeLast (...) với một ArrayList. Nó không cung cấp các phương thức bổ sung để hoạt động dễ dàng trên các đầu của danh sách, vì LinkedList thực hiện –

+2

@Sibi Tôi nghĩ bạn sẽ tìm thấy bạn có thể thêm (int index, E e) ... xem tại đây http://docs.oracle .com/javase/6/docs/api/java/util/List.html # add% 28int,% 20E% 29 – xagyg

+0

@xagyg Tôi đồng ý – Jerome

9

thử

String[] a = {"1", "2"}; 
    String[] a2 = new String[a.length + 1]; 
    a2[0] = "0"; 
    System.arraycopy(a, 0, a2, 1, a.length); 
+13

-1 Điều này tất nhiên sẽ lặp qua tất cả các phần tử trong mảng. –

3
String[] myArray= {"hi","hi2"}; 
List<String> temp = new ArrayList<String>(Arrays.asList(prova)); 
temp.add(0, "h3"); 
myArray = temp.toArray(new String[temp.size()]); 
+0

Thực ra giải pháp của bạn không hoạt động asis. Đây là lý do tại sao: http: // stackoverflow.com/a/2965808/1515058 Điều này sẽ hoạt động: Chuỗi [] myArray = {"hi", "hi2"}; Danh sách danh sách = new LinkedList (Arrays.asList (myArray)); list.add (0, "h3"); myArray = list.toArray (chuỗi mới [temp.size()]); –

1

tốt nhất tôi có thể quản lý ...

public static void main(String[] args) { 
     String[] s = new String[] { "a", "b", "c" }; 
     System.out.println(Arrays.toString(prepend(s,"d"))); 
} 

public static String[] prepend(String[] a, String el) { 
     String[] c = new String[a.length+1]; 
     c[0] = el; 
     System.arraycopy(a, 0, c, 1, a.length); 
     return c; 
} 
+0

@EvgeniyDorofeev Câu trả lời hay. Đánh tôi đi. – xagyg

1

Bạn có thể làm một số điều như dưới đây

public class Test { 

public static String[] addFirst(String s[], String e) { 
    String[] temp = new String[s.length + 1]; 
    temp[0] = e; 
    System.arraycopy(s, 0, temp, 1, s.length); 
    return temp; 
} 

public static void main(String[] args) { 
    String[] s = { "b", "c" }; 
    s = addFirst(s, "a"); 
    System.out.println(Arrays.toString(s)); 
} 
} 
4

này được khắc phục phiên bản của giải pháp đề xuất bởi @matteosilv:

String[] myArray= {"hi","hi2"}; 
List<String> list = new LinkedList<String>(Arrays.asList(myArray)); 
list.add(0, "h3"); 
myArray = list.toArray(new String[list.size()]); 
6

Nếu bạn đã sử dụng ổi bạn có thể sử dụng ObjectArrays::concat để làm điều này:

String[] args = ...; 
ObjectArrays.concat("prepended", args); 
Các vấn đề liên quan