Java의 지문 및 포인터 [중복
문제
이 질문은 이미 여기에 답이 있습니다.
좋아, 그래서 나는 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은 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와 같은 변이 가능한 유형이있는 경우 반복의 문자열을 변경할 수 있습니다. 당신은 참고 문헌이 있습니다.