2010-05-12 39 views
8

Có thể có một mảng chứa hai loại dữ liệu khác nhau không? Tôi muốn có một mảng có chứa một đôi và cũng là một chuỗi. Tôi đã thử:Mảng các loại khác nhau

ArrayList<double><String> array; 

Nhưng điều đó không hiệu quả.

Xin lỗi vì câu hỏi ngớ ngẩn, nhưng đã lâu rồi tôi đã sử dụng một cái gì đó như thế này .. Bạn có thể làm mới bộ nhớ của mình về cách tôi khai báo và điền vào một mảng như vậy không?

Và sau đó để tiến thêm một bước nữa, tôi muốn sắp xếp mảng theo mức gấp đôi nếu có thể?

Cảm ơn!

+1

Không, điều này là không thể. Chính xác những gì bạn đang cố gắng để làm? Có lẽ chúng tôi có thể giúp bạn tìm ra cách giải quyết. –

Trả lời

14

Thứ nhất, nó có giá trị là rõ ràng về sự khác biệt giữa một mảng và một ArrayList - chúng không phải là điều tương tự ở tất cả.

Tuy nhiên, trong cả hai trường hợp, bạn không thể làm những gì bạn muốn. Gần nhất bạn có thể đến là tuyên bố loại của riêng bạn. (CHỈNH SỬA: Mã ban đầu của tôi có một số hoặc một chuỗi ... Bây giờ, tôi đã thay đổi mã đó thành một chuỗi kép .)

public final class DoubleAndString 
{ 
    private final String stringValue; 
    private final double doubleValue; 

    public DoubleAndString(String stringValue, double doubleValue) 
    { 
     this.stringValue = stringValue; 
     this.doubleValue = doubleValue; 
    } 

    public String getString() 
    { 
     return stringValue; 
    } 

    public String getDouble() 
    { 
     return doubleValue; 
    } 
} 

Sau đó, tạo ArrayList<DoubleAndString> hoặc DoubleAndString[].

Bây giờ, điều này cảm thấy hơi vani vào lúc này - có lẽ giá trị chuỗi kép và chuỗi thực sự có ý nghĩa lớn hơn - ví dụ như tên và điểm số. Nếu vậy, hãy đóng gói trong một loại mô tả việc ghép nối phù hợp hơn.

Đối với đặt hàng - bạn thể làm DoubleAndString thực hiện Comparable<DoubleAndString> - nhưng trừ khi đó là chỉ trật tự tự nhiên mà có ý nghĩa, tôi muốn viết một Comparator<DoubleAndString>:

public class DoubleComparator implements Comparator<DoubleAndString> 
{ 
    public int compare(DoubleAndString ds1, DoubleAndString ds2) 
    { 
     return Double.compare(ds1.getDouble(), ds2.getDouble()); 
    } 
} 

Sau đó, bạn có thể sử dụng Collections.sort để sắp xếp một số ArrayList<DoubleAndString> hoặc Arrays.sort để sắp xếp một mảng.

+0

+1, beat'd. Đó sẽ là đề xuất của tôi và kiểu dữ liệu tùy chỉnh. – Robb

2

Có vẻ như bạn muốn có một Bản đồ. Vì bạn muốn sắp xếp Bản đồ, một TreeMap có thể tối ưu.

Map<Double, String> myMap = new TreeMap<Double, String>(); 

Bản đồ là kết hợp. Mỗi cặp đôi có một chuỗi liên kết. Nếu bạn muốn nhiều chuỗi mỗi đôi, bạn có thể sử dụng một

Map<Double, ArrayList<String>> 
1

Bạn muốn làm gì?

Nếu nó không phải là ánh xạ giá trị khóa, bạn nên tạo một lớp mới cho việc này.

2

Vâng, nếu bạn muốn có một mảng với số lượng phần tử tùy ý, thì bạn chỉ cần sử dụng loại là tổ tiên chung cho cả hai. Trong trường hợp này, đó sẽ là Object (vì String và Double đều được thừa kế từ Object). Điều này sẽ yêu cầu bạn phải kiểm tra các loại, mặc dù, khi bạn lấy hoặc sử dụng chúng.

Nếu bạn đang sử dụng số lượng cố định nhiều loại khác nhau, thì những gì bạn thực sự muốn là một "bộ dữ liệu". Tuy nhiên, Java hiện tại không có một bộ thực thi tuple. Đối với hai mục:

public class Pair<T1,T2> 
{ 
    public Pair(){ 
      this(null,null); 
    } 

    public Pair(T1 x1){ 
      this(x1,null); 
    } 

    public Pair(T1 x1, T2 x2){ 
     _x1 = x1; 
     _x2 = x2; 
    } 

    public T1 getFirst(){ 
     return _x1; 
    } 

    public T1 getSecond(){ 
     return _x2; 
    } 

    private T1 _x1; 
    private T2 _x2; 
} 
2

Bạn chỉ có thể làm ArrayList<object> arraylist và sau đó bạn có thể đặt bất kỳ thứ gì vào đó, nhưng đó có thể không phải là thứ bạn muốn. Sau đó, để sắp xếp bạn sẽ chỉ sử dụng bộ so sánh của riêng bạn, nhưng, như đã nói ở trên, hai giá trị này có được kết nối không, hoặc bạn có một mảng thứ nguyên với hai kiểu dữ liệu khác nhau không? Không.

5

Bạn có thể sử dụng ArrayList<Object> và sau đó bạn có thể sử dụng bất kỳ thứ gì mình muốn. Đóng gói double trong đối tượng Double và khi bạn truy lục đối tượng sử dụng instanceof để kiểm tra xem đó có thực sự là double hoặc String.

Tôi phải nói, không có khả năng 'thiết kế' này sẽ giành cho bạn bất kỳ giải thưởng nào. Có thể suy nghĩ lại giải pháp mà bạn đang cân nhắc cho vấn đề của mình và xem liệu bạn có thể làm gì với một cách tiếp cận khác không?

3

Bạn có thể đã biết điều này, nhưng nó không phải là một ý tưởng tốt để lưu trữ các loại khác nhau trong một danh sách. Theo định nghĩa một mảng là một tập hợp các đối tượng tương tự và nhồi nhét tất cả các loại trong nó làm cho mọi thứ mờ. Vì vậy, thực sự bạn muốn có một loại riêng biệt để giữ các giá trị khác nhau này.

2

Một ArrayList theo định nghĩa chỉ chứa một đối tượng cho mỗi vị trí. Bạn có thể làm một cái gì đó như thế này:

List<MyTuple> list = new ArrayList<MyTuple>(); 

public static class MyTuple implements Comparable<MyTuple> { 

    private Double doubleValue; 
    private String stringValue; 

    //getters and setters 

    public int compareTo(MyTuple tuple) { 
     return doubleValue.compareTo(tuple.getDoubleValue()); 
    } 
} 

Sau đó, bạn có thể sử dụng phương pháp Collections.sort() để sắp xếp nó bằng đôi.

0

Bạn có thể muốn xem lớp Cơ sở số.

List<Number> list = new ArrayList<Number>(); 
list.add(new Integer(3)); 
list.add(new Double(5.2)); 

Bạn có thể giải thích những con số như dây đàn, sử dụng NumberFormat:

NumberFormat formatter = new DecimalFormat("#.##"); 
String s = formatter.format(list.get(0)); 

Mặc dù điều này có thể không phải là những gì bạn muốn, bạn là một chút ngắn về chi tiết về mục tiêu cuối cùng của bạn.

0

nếu bạn đang về cơ bản không cố gắng để làm bất cứ so sánh/sắp xếp trên ArrayList sau đó bạn có thể tạo ra một cái gì đó như sau:

Danh sách list = ArrayList mới();

nếu không .. Câu trả lời của Jon Skeet là cách tiếp cận tốt nhất.

Các vấn đề liên quan