2012-03-05 7 views
16

나는 자바를 처음 사용하기 때문에 두 쌍의 배열을 저장하고 싶다. 내 코드는 다음과 같습니다.Java에서 쌍의 배열을 저장하는 방법은 무엇입니까?

import java.util.ArrayList; 
import java.util.Map.Entry; 

List<Entry<Double, Double>> values = new ArrayList<>(); 
Entry<Double, Double> pair; 
// set pair values: 
// pair.setKey(0.5); // this method does not exists 
// pair.setValue(3.6); 
values.add(pair); 

어떻게 쌍 변수를 초기화 할 수 있습니까? 복식 쌍을 배열로 저장할 때 더 좋은 구조가 있습니까?

+1

걱정할 필요가없는 경우 언제든지 시도해보세요. http://www.javatuples.org/ – Nim

+0

중복 된 http://stackoverflow.com/questions/521171/a-java-collection-of-value-pairs 튜토리얼 –

답변

15

은 한 쌍을 표현하기 위해 자신의 클래스를 만들고 두 개의 인수를 사용하는 생성자 추가 What is the equivalent of the C++ Pair<L,R> in Java?

+2

나는 그와 같은 간단한 것을 위해 표준 자바 라이브러리에서 사용할 수있는 것이 없다는 것에 놀랐다. –

+4

그런 '쌍'이 존재하지 않는 이유에 대한 답을 보라. http://stackoverflow.com/questions/156275/ c-pair-r-in-java – hmjd

+0

이 솔루션은 효과적으로 쌍을 이루는 100 개의 서로 다른 클래스를 가질 수 있기 때문에 프로젝트 복잡성을 크게 증가 시킨다는 점에 유의하십시오. 오류가 발생하기 쉽고,보기 흉하고, 비용이 많이 드는 유형 사이에서 사용자 지정 마샬링을 필요로합니다. 모든 페어 라이트가 자신의 마샬 러를 구현했다면 괜찮습니다. 성능을 제외한 모든 문제를 해결하고 이름이 다른 기본 인터페이스를 가진 다른 버전의 페어를 해결합니다. 이는 인터페이스가없고 반사를 사용하여 해결할 수 있지만 이제는 다른 문제가 있습니다. – Dmitry

1

당신은 사용할 수 있습니다

public class MyPair 
{ 
    private final Double key; 
    private final Double value; 

    public MyPair(Double aKey, Double aValue) 
    { 
     key = aKey; 
     value = aValue; 
    } 

    public Double key() { return key; } 
    public Double value() { return value; } 
} 

Pair 자바에 존재하지 않는 이유에 대해이 답변을 참조를 이것을 해결하기위한지도.

+1

각 "키"가 고유 한 경우 true입니다. 'Map'은 중복 키를 허용하지 않습니다. – amit

+0

두 쌍은 동일한 왼쪽 숫자를 가질 수 있습니다 : [(2, 6.3), (2, 8.4)] –

+0

'Double'을 키로 사용한다면, 이 http://stackoverflow.com/q/1074781/1065197 –

1

Entry은 정의한 클래스입니까? new으로 인스턴스를 만듭니다.

Entry<Double, Double> pair = new Entry<Double, Double>(d1, d2); 

주 나는 당신이 2 루타를 사용하는 생성자를 정의 가정입니다, 당신은 d1d2에 대한 참조를 가지고있다.

Map.Entry 클래스를 사용하지 않는 것이 좋습니다. 이 클래스의 의미는 값이 키와 값이며지도의 작동 방식에 적합하도록하는 것입니다.

+0

수입품을보십시오 : "수입품 java.util.Map.Entry;" – rompetroll

0

Entry 클래스에 액세스 할 수있는 경우 키와 값을 매개 변수로 사용하는 생성자를 만들 수 있습니다.

Entry<Double, Double> pair = new Entry<Double, Double>(0.5, 3.6); 
values.add(pair); 
+0

다음과 같은 오류가 발생합니다 :'Map.Entry 형식을 인스턴스화 할 수 없습니다. –

0

사용하려고 시도한 Map.Entry 유형은 인터페이스이며 인스턴스화 할 수 없습니다. Map의 내부 유형을 (잘못) 사용하려는 경우 Map.Entry 구현 HashEntry 콘크리트가 적합합니다.

그러나 자신의 쌍 유형을 구현하는 것이 더 좋습니다. 필요에 따라 배열 대신 Map을 사용하십시오.

5

항목을 사용하고 싶지는 않습니다. 인터페이스가 아닌 클래스입니다. 이 인터페이스는 Map을 구현하는 클래스에서 entrySet()을 호출 할 때 Set의 구현에 사용됩니다. 기본적으로 구현 된 맵을 마치 세트처럼 조작 할 수 있습니다.

무엇을 할 것인가? 이 작업을 시도하면 "Map.Entry 유형을 인스턴스화 할 수 없습니다"라는 줄에 따라 컴파일러 오류가 표시됩니다. 그것은 Map.Entry가 클래스가 아니라 인터페이스이기 때문입니다. 인터페이스에는 실제 코드가 포함되어 있지 않으므로 여기에서 실행할 실제 생성자가 없습니다.

Entry<Double, Double> pair = new Entry<Double, Double>(); 

당신은 당신이 인터페이스의 의미 그것은 "인터페이스의 Map.Entry를"있다고 상단에 명확하게 볼 수있는 아래의 문서를 보면. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Map.Entry.html

불가능한 인터페이스를 인스턴스화하는 대신 수행해야 할 작업은 Pair라는 자체 클래스를 만드는 것입니다. 이 같은. 아래 코드를 사용하는 경우 패키지를 변경해야합니다.

package org.mike.test; 

public class Pair { 
    private double x = 0.0; 
    private double y = 0.0; 

    public Pair(double x, double y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public Pair() 
    { 

    } 

    public double getX() { 
     return x; 
    } 

    public void setX(double x) { 
     this.x = x; 
    } 

    public double getY() { 
     return y; 
    } 

    public void setY(double y) { 
     this.y = y; 
    } 


} 

이제 페어 클래스를 작성하면 코드가 다음과 같이 보입니다.

package org.mike.test; 

import java.util.ArrayList; 
import org.mike.test.Pair; //You don't need this if the Pair class is in the same package as the class using it 

public class tester { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     ArrayList<Pair> values = new ArrayList<Pair>(); 
     Pair pair = new Pair(); 
     // set pair values: 
     pair.setY(3.6); 
     pair.setX(3.6); 
     values.add(pair); 
    } 

} 
+0

멋진데, 쌍 (double, double) 생성자를주었습니다. setX/Y를 단순화하고 제거합니다.) 호출 및 쌍 쌍 = 새로운 쌍 (3.6, 3.6); – Leif

0

또 다른 방법, 및 저장하고 이중 쌍 배열에 아마도 가장 효율적인 방법은 복식의 하나의 배열을 사용하고, (2 * i) 및 사용하는 것입니다 귀하의 인덱싱 (* 2 I + 1) 계획. 또한 어레이를 생성 할 때 배열을 모두 0으로 초기화하므로 추가 단계가 필요하지 않습니다. 아쉽게도 add() 및 remove()를 구현하는 데 약간의 코딩 오버 헤드가 있지만 놀랍게도 해당 페어에 대한 고유 한 컨테이너 클래스를 만드는 것보다 적습니다.

class MyClass { 
    double[] values; 
    int count; 

    MyClass(int initialCapacity) { 
     values = new double[initialCapacity*2]; 
    } 

    // adding a pair 
    void addPair(double x, double y) { 
     if (count*2 >= values.length) { 
      values = Arrays.copyOf(values, values.length*2); 
     } 
     values[count*2] = x; 
     values[count*2 + 1] = y; 
     count++; 
    } 

    void remove(int index) { 
     if (index >= count) throw new IndexOutOfBoundsException(); 

     if (index < --count) { 
      System.arraycopy(values, (index+1)*2, values, index*2, (count - index) * 2); 
     } 
    } 

    int size() { return count; } 

    // both these should check that index < count. 
    double getX(int index) { return values[index*2]; } 
    double getY(int index) { return values[index*2 + 1]; } 

    void exampleIteration() { 
     // getX/Y accessors are examples of how to get 
     // the values, but it will be more efficient 
     // in most cases to just access the array 
     // array directly as so... 
     for (int i=0 ; i<count ; ++i) { 
      System.out.printf("%d: (%f,%f)%n", i, values[i*2], values[i*2+1]); 
     } 
    } 
} 
2

당신은

public class MyClass<A,B> extends ArrayList{ 
private A first; 
private B second; 
public MyClass(A first, B second){ 
super(); 
this.first = first; 
this.second = second;} 
} 

사용 후 제 1 및 제 2 접근 & mutator 메소드와 함께 추가 방법의 일부 양식을 추가 할 수 없습니다? 나는 프로그래밍에 익숙하지 만,이 방법은 효과가있는 것처럼 보일뿐 아니라 DOUBLE 이외의 다른 것들에도 접근 할 수있다. (Integer 나 String과 같은 다른 유형을 사용하려는 경우) .

관련 문제