Edycja elementów ArrayList<String>

0

Witam,

Od niedawna zacząłem pisać coś w Javie, mam już w jakimś stopniu ogarnięte podstawy C++.
Problem polega na tym, że przekazuję ArrayListe z objektu jednej klasy do objektu drugiej klasy, w efekcie mam do niej dostep, mogę ją wyświetlić jednak jeżeli chcę zmienić wartość elementów (String) tej listy to po prostu nic się nie dzieje. Oto mój kod przedstawiający w jaki sposób ja to robię, proszę o wyjaśnienie jak powinno to wyglądać aby działało poprawnie :)

Main:

public class Main {

    public static void main(String[] args) {
        Class1 obj1 = new Class1();
        Class2 obj2 = new Class2();

        obj2.makeList();

        obj1.makeList(obj2.getList());
        obj1.editList();
        obj1.showList();
    }
}
 

Class1:

public class Class1 {
    ArrayList<String> list2;

    public void makeList(ArrayList<String> listX){
        list2 = listX;
    }

    public void showList(){
        for(String x : list2){
            System.out.println(x);
        }
    }

    public void editList(){
        for(String x : list2){
            x="edited";
        }
    }
}
 

Class2:

public class Class2 {
    ArrayList<String> list;

    public void makeList(){
        list = new ArrayList<String>();
        list.add("zero");
        list.add("one");
        list.add("two");
        list.add("three");
    }

    public void showList(){
        for(String x : list){
            System.out.println(x);
        }
    }

    public ArrayList<String> getList(){
        return list;
    }
}
 

W efekcie wyświetlona zostaje lista bez jakichkolwiek zmian.

//Edit

Chyba edytuje tylko zmienną pomocniczną String x, a nie elementy listy.....
Jak poprawnie edytowac elementy listy?

0

Masz dwie opcje: zamienić for(each) na for(int x = 0;;) albo opakować String w jakąś strukturę np. utworzyć klasę Node i tam trzymać string jako name.

1

możesz użyć metody set : lista.set(indexDoZmiany, nowaWartosc)

0

Tak jak wyżej napisano musisz użyć normalnego fora:

	public void editList() {
		int length = list2.size();
		for (int i = 0; i < length; i++) {
			list2.set(i, "edited");
		}
	}

a jeśli faktycznie wszystkie elementy w liście mają mieć nazwę "edited" to tak będzie szybciej:

	public void editList() {
		Collections.fill(list2, "edited");
	}
1

Edycja list jest "be", jak nie musisz to nie rób tego. Dodatkowo Stringi są traktowane inaczej niż inne obiekty, stąd Twoje problemy z edycją konkretnych elementów poprzez for-each (jak zaczynasz to poczytaj o podstawowych wrapperach: Integer, Long, Double, String - hasło w google: "how String are handled in Java").

W Twoim przypadku sugeruję zmienić:

    public static void main(String[] args) {
        Class1 obj1 = new Class1();
        Class2 obj2 = new Class2();
 
        obj2.makeList();
 
        obj1.makeList(obj2.getList());
        obj1.editList();
        obj1.showList();
    }

Po pierwsze:
W obj1.editList() NIE tworzysz nowej listy, ale edytujesz tę należącą do do obj2 (w Javie obiekty przekazywane są przez referencje). Lepiej stworzyć nową. Chyba, że chcesz aby obie klasy korzystały z jednej listy, przy czym żeby obj1 wyedytowało to, co widzi obj2 - wtedy przepraszam :)

Po drugie:
Troszkę nie rozumiem idei:

	obj1.makeList(obj2.getList());
        obj1.editList();
        obj1.showList();

Jeśli chcesz stworzyć nową listę po to tylko, żeby ją zaraz zmienić to dlaczego nie zamknąć tego w jednej operacji? Tzn.

public class Class1 {
	List<String> list;
	
	// some code
	
	public void makeList(List<String> sourceList){
		this.list = new ArrayList<String>();
		for(String string: sourceList){
			this.list.add(mapSourceString(string));
		}		
	}

	private String mapSourceString(String source){
		return "edited";
	}

	// some code
}

Albo oczywiście można na lambdach (dla Javy 8):

public class Class1 {
	List<String> list;
	
	// some code
	
	public void makeList(List<String> sourceList){
		this.list = sourceList.stream().map(source -> mapSourceString(source).collect(Collectors.toList());
	}

	private String mapSourceString(String source){
		return "edited";
	}

	// some code
}
0

Dzięki, chodziło mi właśnie o tą metodę, którą podał Wybitny Terrorysta.
Co do tego jak wygląda kod, który podałem, to zrobiłem tylko tak na szybko żeby zobrazować o co mi chodzi, a ta metoda potrzebna była mi do innego kodu, nad którym pracuję.
Jeszcze raz, dzięki bardzo za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1