Java 콜렉션 API에 마지막 방법이없는 이유는 무엇입니까? [닫은]


19

이것은 java.util.List와 같은 정렬 된 컬렉션을위한 것입니다. 언어 디자이너가 왜 마지막 방법을 포함하지 않았습니까? 내가 생각할 수있는 유일한 이유는 다음과 같습니다.

  • 컬렉션이 비어있을 때 모호함 (널 리턴 또는 예외 예외)
  • API 팽창

다른 이유가 있습니까?


9
내가 써야 할 순전히 +1 collection.get(collection.size() - 1).
jprete

1
이 메소드가있는 유틸리티 클래스와 콜렉션에 사용할 다른 메소드를 작성해보십시오.
Mahmoud Hossam

7
first () 메소드도 없으므로 last () 메소드가 있어야하는 이유는 무엇입니까?
피터 테일러

6
@Peter는 getLast ()를 구현하지 않는 것보다 나쁜 점은 get (-1)과 같은 핵으로 구현하는 것입니다.
Alb

2
@Alb 나는 "해킹"이 보는 사람의 눈에 있다고 생각합니다 :)이 시점에서, 나는 파이썬의 -1 구문에 감사합니다. 물론, 미래 나 과거에 언젠가 다시 물어 보면, 당신이 느끼는 것과 똑같이 느낄 수 있습니다.
3 컵

답변:


13

API 팽창이 아마도 답일 것입니다. 내 경험상이 기능이 필요한 유일한 시간은 대기열 또는 스택이 적절한 방법을 가진 작업에 대한 올바른 데이터 구조였습니다.


부분적으로 정확하다고 생각하지만 Java get(-1)가 목록 끝에서 검색을 지원 하면 API 팽창을 추가하지 않고 OP가 원하는 것을 수행합니다. 그와 같은 나의 대답은 설명 할 수없는 다운 보트를 이끌어 냈습니다.
user949300

1
더 큰 대답은 기본 인터페이스 메소드를 지원하는 Java의 초기 실패 (.NET에서 반복되고 후자의 경우 여전히 진행 중)는 인터페이스에 99 %의 구현이 동일한 방식으로 처리하는 멤버가 포함되어 추가 작업을 부과한다는 의미입니다 에 모두 다르게 구현하는 것이 그 소수의 이익을 위해 구현.
supercat

16

last()방법만큼이나 쉽다 list.get(list.size()-1)더이없는 것처럼, first()방법 또는 fifth()방법. 합성하기가 어렵지 않고 전문화되어 있습니다. 당신은 또한 reverse()목록과 항목 list.get(0)을 줄 것입니다 수 있습니다 last. 수행하기 쉬운 것은 일반적으로 고유 한 방법을 얻지 못합니다.

import java.util.ArrayList;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        final List<String> l = new ArrayList<String>();

        l.add("A");
        l.add("B");
        l.add("Z");

        System.out.println("l.get(0) = " + l.get(0));
        System.out.println("l.get(l.size()-1) = " + l.get(l.size() - 1));
    }
}

결과는 다음과 같습니다.

l.get(0) = A
l.get(l.size()-1) = Z

또한 List인터페이스 를 구현하는 모든 것이 실제로 last()어떤 개념을 가지고 있다고 가정하는 것도 전제 입니다.


1
그러나 두 경우 모두 더 명확 할 것이다
Anto

컬렉션이 아직 완전히 채워지지 않은 경우 size () 메서드가 응답하지 않을 수 있습니다.

1
.size()현재 크기를 반환 .size()-1해도 여전히 마지막 요소가됩니다. 완전히 채워 졌는지 여부를 어떻게 알 수 있습니까?

1
사양으로 목록 때문에, 케이스의 크기는 () Integer.MAX_VALUE를 돌려줍니다하는,에 Integer.MAX_VALUE보다 많은 요소가 포함될 수 있습니다 .size()-1구현할 수있는 완벽한 방법은 아니다 last()같은 큰 목록이 매우 가능성이 있지만 (그리고 내가 어떻게 그런 목록을 궁금해 구현할 것입니다 toArray()...)
user281377

1
C #에는 .First & .Last 메서드가 있습니다. 마지막 항목을 얻기 위해 목록을 되 돌리는 것도 정확하지 않습니다.
Carra

5

java.util.LinkedList정의 getLast()getFirst()방법을. 불행히도 이러한 메소드는 인터페이스 중 하나에 정의되어 있지 않으므로 LinkedList 유형을 사용해야합니다. 마지막 요소에만 관심이 있다면 java.util.Queue인터페이스의 peek()방법 을 사용하는 것이 좋습니다 . LinkedList는 큐를 구현합니다.


0

기본적으로 당신이 중 하나를 요청해야 size()A에 대한 for반복자를 요청하고 한 동안 그것을 사용하거나 할 - 루프에 의해 -loop 또는 반복 처리 그것. 목적에 맞는 것을 사용하십시오.

반복자는 주어진 지점에서 더 많은 항목이 있는지 알고 있으며 다음 항목이 있으면 얻을 수 있습니다. 그런 다음 "더 많은 항목이 있습니까?"까지 반복하십시오. 실패합니다.

http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html 의 "Traversing Collections"섹션을 참조하십시오.


이것은 질문에 대한 답변이 아닙니다. 반복자를 사용하여 목록의 마지막 요소를 찾는 것도 매우 비효율적입니다.
fishinear
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.