2017-03-27 1 views
0

내 프로그램에서 카드를 내 자신의 LinkedList (java.util이 아닌)로 만들었습니다.정수 쌍인 객체 정렬

각 카드 2의 int 이루어지는 목적 - 첫번째는 카드 (1 ~ 13)의 값, 제 (0 내지 3) 카드의 색이다. 값이

0 지금 내가 추가하는 동안 그들을 정렬하는 카드를 추가 내 방법을 업그레이드 할 때

목록

무작위로 생성되고 목록이 만들어집니다. 먼저 값으로, 다음으로 색상으로.

public class Lista { 
private Element pocz; //start 
public int rozmiar; 

public Lista() { 
    boolean zrobione = false; 
    while (zrobione != true) { 
     Karta karta = new Karta(); 
     if (karta.getWartosc() == 0) { 
      zrobione = true; 
     } else { 
      this.dodaj(karta); 
     } 
    } 
} 

public void dodaj(Karta k) { 
    if (pocz == null) { 
     pocz = new Element(k); 
    } 

    Element pom = new Element(k); 
    Element obecny = pocz; 
    if (obecny != null) { 
     while (obecny.getNext() != null) { 
      obecny = obecny.getNext(); 
     } 
     obecny.setNext(pom); 
    } 
    rozmiar++; 
} 

내가 꽤에 대한 해결책을 생각하고 같은 내놓았다되었습니다 :

public void dodaj(Karta k){ 
    if(rozmiar == 0) { 
     if (pocz == null) { 
      pocz = new Element(k); 
     } 

     Element pom = new Element(k); 
     Element obecny = pocz; 
     if (obecny != null) { 
      while (obecny.getNext() != null) { 
       obecny = obecny.getNext(); 
      } 
      obecny.setNext(pom); 
     } 
     rozmiar++; 
    } 
    else{ 
     Element pom = new Element(k); 
     Element obecny = pocz; 
     boolean znalezione = false; 
     if(obecny != null && !znalezione){ 
      while(obecny.getNext() != null && !znalezione){ 
       if(obecny.getKarta().wartosc < obecny.getNext().getKarta().wartosc) { 
        obecny.setNext(pom); 
        znalezione = true; 
       } 
       else if(obecny.getKarta().wartosc == obecny.getNext().getKarta().wartosc){ 
        if(obecny.getKarta().kolor < obecny.getNext().getKarta().kolor){ 
         obecny.setNext(pom); 
         znalezione = true; 
        } 
        else if(obecny.getKarta().kolor == obecny.getNext().getKarta().kolor){ 
         obecny.setNext(pom); 
         znalezione = true; 
        } 
        else{ 
         obecny = obecny.getNext(); 
         obecny.setNext(pom); 
         znalezione = true; 
        } 
       } 
       else{ 
        obecny = obecny.getNext(); 
        obecny.setNext(pom); 
        znalezione = true; 
       } 
      } 
     } 
     rozmiar++; 
    } 
} 

그러나이 방법은 있습니다 여기에

내 코드는 지금과 같은 모습입니다 내 목록에만 2 장의 카드가 포함되어 있고 그것이 모두 작동하는지 잘 모르겠습니다 ... 변수 및 클래스의 영어 이름을 사용하지 못해 죄송합니다.

내가 무엇을 달성하고자하는 예 :
wartosc이 카드의 값이
kolor
dodaj 의미 카드의 색상

Before sorting 
11 2 
5 3 
2 3 
13 0 
1 2 
5 2 
1 1 
5 1 

After sorting 
1 1 
1 2 
2 3 
5 1 
5 2 
5 3 
11 2 
13 0 

rozmiar 목록의 크기입니다

답변

0
"추가"

각 메소드/필드의 의미를 모른 채 코드를 이해하는 것은 매우 어렵습니다. 그러나 일반적으로 Card 클래스에 Comparable 인터페이스를 구현하십시오. 그리고 적절한 compareTo 메서드를 정의하십시오. 그것은 나중에

public class Card implements Comparable<Card> { 
    private int value; 
    private int color; 

    //... 

    @Override 
    public int compareTo(@NotNull Card o) { 
     final int valueResult = Integer.compare(value, o.value); 
     if (valueResult != 0) { 
      return valueResult; 
     } 
     return Integer.compare(color, o.color); 
    } 
} 

훨씬 더 간단 것 그리고 그 후 당신은 card1.compareTo(card2)를 호출하여이 카드를 비교할 수 있습니다.

+0

문제는 내 작업은 compareTo를 사용하지 않고이 작업을 수행하는 것입니다. 나도 알아, 그 바보 알아하지만 ... – Szouter

0

문제는 내 compareTo를 사용하지 않고이 작업을 수행하는 것입니다. 자바 정렬 방법을 사용하지 않고 프로그래밍 방식으로 그것을 할 필요가 있다면

음, 동일한 키가 요소를 재 배열하지 않는 안정적인 종류의 = 알고리즘, 예를 사용 점자 삽입에 좋은 정렬 또는 삽입 정렬을 병합하십시오. 이 경우 먼저 배열을 으로 정렬 한 다음 값을으로 정렬하십시오. 안정된 정렬은 값이 인 카드를 순으로 정렬 된 순서대로 남겨 둡니다.

https://en.wikipedia.org/wiki/Category:Stable_sorts

예 의사 코드 :

int[][] cards; 

cards = mergeSort(cards, cards[1]); 
cards = mergeSort(cards, cards[0]); 

Object[] mergeSort(Object[] array, int[] keys) {...} 
0

노력에 대한 너희들 감사하지만 난 어디 LinkedList의에서 새로 생성 된 카드가해야 따지기하는 방법을 작성하는 것입니다 무슨 생각 추가 될 수 있습니다. 당신이 두 번째 방법 "dodaj"내가 제출처럼 뭔가 ...

+0

당신은 질문 섹션에 작성해야합니다 (이 정보로 업데이트). 그것은 당신의 질문에 대한 답이 아니기 때문입니다. 추가 정보 일뿐입니다. –

0

나의 제안은 다음과 같습니다

당신은 당신의 코드에 대한 명명 규칙을 자바 언어 사용을 사용하는 경우
  • . 그것은 당신의 코드가 다른 개발자들에게 이해 될 수있게합니다.
  • Java 8을 사용하십시오. 단순성 수집 루틴을위한 많은 기능이 있습니다.

    @Getter 
    @NoArgsConstructor 
    @AllArgsConstructor 
    class Card { 
        private int value; // 1-13 
        private int colour; // 1-3 
    
        @Override 
        public String toString() { 
         return String.valueOf(value + " " + colour); 
        } 
    } 
    
    public class ComparatorDemo { 
        public static void main(String[] args) { 
         final List<Card> cards = Arrays.asList(
           new Card(11, 2), 
           new Card(5, 3), 
           new Card(2, 3), 
           new Card(13, 0), 
           new Card(1, 2), 
           new Card(5, 2), 
           new Card(1, 1), 
           new Card(5, 1)); 
    
         final Function<Card, Integer> byValue = Card::getValue; 
         final Function<Card, Integer> byColour = Card::getColour; 
    
         System.out.println("Before sorting"); 
         cards.forEach(System.out::println); 
    
         List<Card> sortedList = cards.stream() 
           .sorted(Comparator.comparing(byValue).thenComparing(byColour)) 
           .collect(Collectors.toList()); 
    
         System.out.println(); 
         System.out.println("After sorting"); 
         sortedList 
           .forEach(System.out::println); 
        } 
    } 
    

    Card 클래스를 사용하면 Kartka라는 것입니다 :

나는 작은 데모를 만들었습니다. 나는 여분의 코드를 생략하기 위해 Lombok framework annotation @Getter을 사용했다.
또한 테스트 데이터는 질문에서 언급 한 값과 정확히 동일합니다.

출력입니다 :

Before sorting 
11 2 
5 3 
2 3 
13 0 
1 2 
5 2 
1 1 
5 1 

After sorting 
1 1 
1 2 
2 3 
5 1 
5 2 
5 3 
11 2 
13 0