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.