2012-09-30 9 views
0

제네릭 arraylist에서 제출 한 정보로 TextArea를 업데이트하는 방법을 파악하는 데 문제가 있습니다.Java에서 ArrayList 정렬

Order d1 = new Order(); 

그런 다음 사용자가 어떤 데이터를 선택하고 추가 버튼을 가압하고, 순서가 텍스트 영역에 추가되어 현재로서는 프로그램이 새로운 주문을 생성한다. 문제는 목록의 올바른 위치에 주문을 추가하고 매번 업데이트해야한다는 것입니다. 나는 "하나 개의 항목 만하여 정렬거야. 나는 compareTo 메소드를 사용하여 그렇게하는 방법을 정말 모르겠어요.

public void actionPerformed(ActionEvent event) 
{ 
    ArrayList<Drink> DrinkArray = new ArrayList<Drink>(); 

    if (event.getSource() == addcoffeeButton) 
    { 

     String coffeesize = (String) sizecoffeelist.getSelectedItem(); 
     double coffeeprice = Double.parseDouble(pricecoffeeTextfield.getText()); 

     String coffeetype = (String) cuptypecoffeelist.getSelectedItem(); 
     String coffeecaffeine = (String) caffeineList.getSelectedItem(); 
     String coffeeroom = (String) roomforcreamList.getSelectedItem(); 
     String coffeeadditional = additionalflavorList.getText(); 
     if ((coffeeadditional.isEmpty())) 
      coffeeadditional = "No Additional Flavor"; 

     Drink d1 = new Coffee(coffeesize, coffeeprice, coffeetype, coffeecaffeine, coffeeroom, coffeeadditional); 


      DrinkArray.add(d1); 
      orderTextArea.append(d1); 

그래서 배열에 추가하기 전에 올바른 자리에 음료를 추가해야 텍스트 영역에 인쇄,하지만 할 방법을 확실히 모르겠어요.

+2

자세히 설명해 주시겠습니까? 너는 그다지 설명하지 않았어. 정확한 * 자리가 뭐지? "매번"어떻게 업데이트하고 있습니까? – oldrinb

+0

작은 관찰, 일반적으로 주문은 FIFO에서 처리됩니다. 고객이 VIP가 아니기 전까지는 정렬의 개념이 이상하게 보입니다. 그 외에 객체 지향을 더 많이 만들어야합니다. 먼저 문자열을 enum으로 바꾸고, string은 app의 비즈니스 로직이 아닌 문자의 순서를 나타내야합니다. 그 후에 당신은 커피 물체를 생산하는 공장을 가져야 만합니다. 그런 다음 보통 B 또는 WNS (White No Sugar)를 주문할 경우에는 그러한 모든 설정이 필요하지 않습니다 .--). 이 책 "헤드 퍼스트 디자인 패턴"을 읽어 보시기 바랍니다. –

답변

2

내가 DrinkComparable를 구현하는 것으로 가정합니다. 그게 무슨 뜻인지 모르는 경우의 javadoc 봐.

그게 사실이라면 다음과 같이 할 수 있습니다.

List<Drink> drinks = new ArrayList<Drink>(); 
// add Drinks 
Collections.sort(drinks); // now they're sorted according to your Comparable. 

Comparator을 인스턴스화하고 정렬 방법으로 전달할 수도 있습니다. 이 같은

뭔가합니다 (getValue을 당신이 원하는대로() 함수) : 당신은 기본적으로 "개체"가 삽입 될 삽입 지점을 미리 결정해야

public class DrinkComparator implements Comparator<Drink> { 
    public int compare(Drink d1, Drink d2) { 
     if (d1.getValue() < d2.getValue()) { 
      return -1; 
     } else if (d1.getValue() > d2.getValue()) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 

    public boolean equals(Object obj) { 
     return this.compare(this, (Drink)obj) == 0; 
    } 
} 
+0

필자는 Comparable을 구현했습니다. 그러나 CompareTo 메소드를 아직 재정의하지 않았습니다. 길이가 속성 인 경우 어떻게 처리합니까? –

+0

음료는 길이가 있습니까? 나는 당신이 알파벳순으로 이름이나 주류 내용, 또는 Drink 본질적 인 다른 속성으로 알파벳 순으로 정렬 할 것이라고 추측했을 것입니다. 길이는 무엇과 관련이 있습니까? – duffymo

+0

변수를 위로 만들고 크기를 예제로 사용할 수 있습니다.배열의 모든 크기를 비교하여 특정 순서로 배치하는 새 CompareTo 메서드를 만들어야한다는 것을 알고 있습니다. 그러나이를 수행하는 방법을 잘 모르겠습니다. –

0

...

자바 문서

반환에서 Collections.binarySearch(List<T>, T)

를 살펴 보자 :

검색 키의 색인 (목록에 포함되어있는 경우). (- (삽입 점) - 1). 삽입 지점은 키가 목록에 삽입되는 지점 인 으로 정의됩니다. 키보다 큰 첫 번째 요소의 인덱스 또는 목록의 모든 요소가 지정된 것보다 작은 경우 list.size() 키. 이 은 키가있는 경우에만 반환 값이> = 0이되도록합니다.