2017-12-30 49 views
-2

Ich habe eine Liste von Daten ID wie in der Lage, sie durch X zu duplizieren, also speziell, wenn meine Liste liest A, B, C und X = 3 ID wie es A zu lesen, A, A, B, B, B, C, C, C versuchten, dies durch eine Schleife zu tun, aber steckte zuerst mit der Listengröße immer wachsenden und dann mit dem Setzen des Elements in den richtigen Index wieder wie die Liste wächst kann jemand Hilfe?Wie man Elemente in einer Liste in Java duplizieren

+3

Klingt so, als müssten Sie Ihre Startliste nicht ändern, sondern stattdessen eine neue Liste für Ihre Ergebnisse erstellen. – hnefatl

+1

Erstellen Sie eine neue Liste, die X-mal mit jedem Element gefüllt wird. Dann gebe entweder diese Liste zurück oder lösche die alte und ersetze ihren Inhalt durch eine neue Liste. – Pshemo

Antwort

1

Für so etwas wie dieses, ist es wahrscheinlich einfacher zu lernen, indem sie zu sehen und nicht durch Erklärungen zu hören, was zu tun ist, um hier einige einfache Arbeitscode:

public List<Date> repeat(List<Date> dates, int times) 
{ 
    List<Date> results = new ArrayList<>(); 
    for (Date d : dates) 
    { 
     for (int i = 0; i < times; ++i) 
      results.add(d.clone()); 
    } 
    return results; 
} 

Wir Erstellen Sie eine neue "Ergebnisliste", die wir erstellen, indem Sie über die Eingabeliste iterieren - für jedes Element in der Eingabeliste fügen wir dieses Element mehrmals zur Ergebnisliste hinzu. Dies macht den Algorithmus viel einfacher als versuchen, Ihre Artikel in der gleichen Liste zu duplizieren!

Beachten Sie, dass wir das Datum jedes Mal klonen - sonst werden wir mit einer Liste enden, die Sequenzen von Elementen enthält, die alle auf das gleiche tatsächliche Date Objekt zeigen - in den meisten Fällen nicht ideal.


können Sie Generika verwenden diese Methode mehr wiederverwendbar zu machen - am besten, wir möchten, dass dies für alle Cloneable Objekten arbeiten, nicht nur Date s:

public static <T extends Cloneable> List<T> repeat(List<T> in, int times) 
{ 
    List<T> results = new ArrayList<>(); 
    for (T x : in) 
    { 
     for (int i = 0; i < times; ++i) 
      results.add(x); 
    } 
    return results; 
} 

Code demo (generics version).

+0

Das ist großartig vielen Dank, also tbh Ich habe mich nur in den Fuß geschossen, indem ich versucht habe es zu behalten in der ursprünglichen Liste – martinseal1987

+0

@ martinseal1987 Genau - es gibt Algorithmen, die leicht gemacht werden können ["in-place"] (https://en.wikipedia.org/wiki/In-place_algorithm) - das ist einfach nicht einer von Sie. – hnefatl

1

Ich schrieb die Lösung in C#, wie ich keine Java-IDE auf diesem Computer habe, aber es ist nur ein Haar anders als Java. Die Logik (und der Großteil des Codes) ist gleich. Versuchen Sie folgendes:

public static List<string> createList(List<string>originalList, int x) 
{ 
    List<string> newList = new List<string>(); 
    foreach(string s in originalList) 
    { 
     for(int i=0; i<x; i++) 
     { 
      newList.Add(s); 
     } 
    } 
    return newList; 
} 
+0

Das sieht so aus, als würde es funktionieren, aber ich gebe die Punkte für die Lösung unten, da es in Java ist. Vielen Dank für die schnelle Antwort. – martinseal1987

-1

Sie müssen eine verknüpfte Liste hinzufügen. Verwenden Sie dieses Programm, um die Funktionalität zu erreichen.

import java.util.LinkedList; 

public class LinkedListExample { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     LinkedList<String> al=new LinkedList<>(); 
     al.add("A"); 
     al.add("B"); 
     al.add("C"); 
     modify(al,4); 

     System.out.println(al); 
    } 

    private static void modify(LinkedList<String> al, int X) { 
     int size=al.size(); 
     for(int j=0;j<size;j++) 
     { 
      for(int i=1;i<X;i++) 
      { 
       al.add(X*j, al.get(X*j)); 
      } 

     } 

    } 

} 
+0

Sie brauchen keine 'LinkedList', jede Liste wird funktionieren, wenn Sie diese Methode verwenden, obwohl' LinkedList' einen Vorteil hat, den Sie nicht erwähnt haben. Und vielleicht möchten Sie eine Erklärung hinzufügen - es ist nicht sofort klar, welche Zeilen wie 'al.add (X * j, al.get (X * j))' tun. Schließlich ist es vielleicht eine gute Idee, den Code aufzuräumen - Sie mischen Brace-Stile und haben einen zufälligen Kommentar. – hnefatl

+0

Mein Freund, ich habe die verknüpfte Liste verwendet, weil er Änderungen in der gleichen Liste wollte und nicht nach einer neuen Liste gefragt. Das Einfügen dazwischen wird immer über eine verknüpfte Liste und nicht über eine andere Liste empfohlen. Mein Ziel war es, die gleiche Liste zu verwenden, um das Ergebnis zu erzielen. Bitte stimmen Sie nicht ab, wenn Sie sich nicht sicher sind. –

Verwandte Themen