문제

이 질문은 이미 여기에 답이 있습니다.

좋아, 그래서 나는 Arraylist를 통해 반복하고 특정 요소를 제거하고 있습니다. 그러나, 나는 for-each like 구조를 사용하는 데 어려움을 겪고 있습니다. 다음 코드를 실행할 때 :

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for(String t : arr)
{
  t = " some other value "; //hoping this would change the actual array
}

for(String t : arr)
{
  System.out.println(t); //however, I still get the same array here
}

내 질문에, 'T'를 'ARR'에 대한 포인터로 만들 수 있도록 각각의 고리에서 값을 변경할 수 있습니까? 나는 다른 구조를 사용하여 Arraylist를 루프 할 수 있다는 것을 알고 있지만, 이것은 깨끗하고 읽을 수있는 것처럼 보이며 't'를 포인터로 만들 수 있다는 것이 좋을 것입니다.

모든 의견에 감사드립니다! 당신이 말하더라도 나는 그것을 빨고 다른 구성을 사용해야합니다.

도움이 되었습니까?

해결책

최선의 접근 방식은 For Loop을 사용하는 것입니다.

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

    for (int i = 0; i < arr.size(); i++) {

        String t = arr.get(i);

        if (// your condition is met) {
            arr.set(i, "your new value");
        }
    }

다른 팁

문제는 루프 스코프를 변경하려고한다는 것입니다. 참조 t 새 문자열 인스턴스를 가리키도록합니다. 이것은 작동하지 않을 것입니다. Arraylist의 실제 항목을 참조하지 않습니다. 실제를 변경해야합니다 참조의. 만약에 String 돌연변이가되었고 가상을 제공했습니다 set() 이를위한 방법은 이론적으로 할 수 있습니다

for (String t : arr) {
    t.set("some other value");
}

또는 그렇지 않지만 불변이기 때문에 불가능합니다. 정상을 사용하여 배열 자체에서 Entrypoint를 처리하는 것이 좋습니다. for 고리:

for (int i = 0; i < arr.size(); i++) {
    arr.set(i, "some other value");
}

향상된 것을 사용한다고 주장한다면 for 루프, 그러면 교체해야합니다 String ~에 의해 StringBuilder, 변이 가능 :

for (StringBuilder t : arr) {
     t.delete(0, t.length()).append("some other value");
}

Java는 통과하는 것이 아니라 통과 별입니다.

Teach는 인덱스 포인터를 제공하지 않으므로 불변의 가치를 변경하는 데 사용할 수 없습니다.

인덱스가있는 for-loop를 사용하거나 변동성 유형 (문자열이 아닌 Stringbuffer와 같은)을 사용하십시오.

Java의 객체 배열 (문자열과 같은)은 순서대로 일련의 참조를 포함하는 인접한 블록입니다. 따라서 4 개의 문자열 배열이 있으면 실제로 가지고있는 것은 배열에 저장된 4 개의 참조와 배열 외부에 있지만 4 개의 요소로 참조되는 4 개의 문자열 객체입니다.

Java의 시작 구조가하는 일은 로컬 변수를 생성하고 각 반복에 대해 해당 반복에 해당하는 배열 셀의 참조를 해당 로컬 변수로 복사하는 것입니다. 루프 변수를 설정할 때 (t = " some other value") 새 문자열을 참조하고 있습니다. "some other value", 배열이 아닌 로컬 변수 t로.

루프 변수가 배열/목록 요소 자체에 별명처럼 작용하는 일부 다른 언어 (Perl과 같은)와 대비됩니다.

코드는 컴파일러에 의해 다음과 같이 다시 작성됩니다.

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for (final Iterator <String> i = arr.iterator(); i.hasNext();) {
    String t;

    t = i.next();
    t = " some other value "; // just changes where t is pointing
}

당신이 원하는 것을하기 위해서는 다음과 같은 루프를 써야 할 것입니다.

for (final ListIterator<String> i = arr.iterator(); i.hasNext();) {
     final String t;

     t = i.next();
     i.set("some other value");
}

반복자에는 설정 메소드가 없으며 ListIterator 만 수행합니다.

기본적으로 목록에서 문자열 t를 제거하려고합니다. arr.remove (t) 만하면 할 수 있습니다. 하지만 같은 목록을 반복하는 동안 할 수 없습니다. 이 방법으로 목록을 수정하려고하면 예외가 발생합니다.

두 가지 옵션이 있습니다.

  1. 목록을 복제하고 클론을 반복하고 원래 목록에서 '특정'문자열을 제거하십시오.
  2. 삭제 후보자 목록을 작성하고 해당 목록에 모든 '특정'문자열을 추가하고 원래 목록을 반복 한 후 폐기물을 반복하고 원래 목록에서 여기에서 수집 한 모든 것을 제거하십시오.

옵션 1은 Easist이고 복제는 다음과 같이 만들 수 있습니다.

List<String> clone = new ArrayList<String>(arr);

Java에서 객체/참조가 어떻게 작동하는지 오해하는 것 같습니다. 이는 언어를 효과적으로 사용하는 데 매우 기본적인 것입니다. 그러나 여기 의이 코드는 원하는대로해야합니다 (설명 부족에 대한 사과) :

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for(int i = 0; i < arr.size(); i++)
{
  arr.set(i, " some other value "); // change the contents of the array
}

for(String t : arr)
{
  System.out.println(t); 
}

나는 이것이 불변 또는 변이성과 관련이 없다고 생각합니다.

 t = " some other value "; //hoping this would change the actual array

t는 실제 물체에 대한 참조를 보유하지 않습니다. Java는 ArrayList에서 값을 복사하고 해당 값을 T로 넣으므로 배열 목록 값이 영향을받지 않습니다.

HTH

이것은 잘 대답되었습니다. 아직도 여기 내 제안이 있습니다. 내부 루프는 거기에서만 볼 수 있습니다. 루프 외부에는 보이지 않습니다. 당신은 할 수 있습니다 t.set() 그렇지 않은 경우 String.

a StringBuffer 평범한 줄보다는. 이렇게하면 내부의 문자열이 변경 가능합니다.

줄은 불변입니다. StringBuilder/Buffer와 같은 변이 가능한 유형이있는 경우 반복의 문자열을 변경할 수 있습니다. 당신은 참고 문헌이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top