2014-09-04 3 views
-1

개체 배열 중에서 두 번째로 큰 요소를 찾는 방법을 알아야합니다. 예를 들면. 재고 수량 책 이름, 가격 등의 속성을 가진 Book 클래스의 객체의 배열이 존재하는 경우, 우리는 이름처럼 및 재고 수량의 다른 속성과 함께 두 번째로 큰 가격으로 책을 나열 할 수 있습니다 방법개체 배열에서 두 번째로 큰 요소를 찾는 방법

Book[] b=new Book[]; 
b[0]=new Book("x",200,50); 
b[1]=new Book("y",100,44); 
b[2]=new Book("z",500,29); 

+6

음, 기본적으로 두 가지 방법이 있습니다. 지금까지 발견 한 것 중 가장 비싸고 두 번째로 비싼 것을 모두 추적하여 모두 반복 할 수 있습니다. 또는 적절한 비교자를 작성하고 배열을 정렬 한 다음 두 번째 요소를 선택할 수 있습니다. 당신은 이것들 중 하나를 시험해보고, 붙어있을 때 도움을 청합니다. –

+0

추신 : @ DavidWallace의 두 번째 옵션을 사용하겠습니다. : P – TheLostMind

+0

간단한 패스만큼 빠르며 * k *로 확장 가능한 세 번째 방법이 있습니다.이 알고리즘은 선형 시간의 * kth * 가장 작은 (가장 큰) 요소를 찾는 ** 선택 알고리즘 **입니다. –

답변

3

정렬이 Collections.sort를 사용하여, 그것에서 BooksList 확인하고 인덱스에있는 요소를 가지고 1.

List<Book> booklist = new ArrayList<Book>(Arrays.asList(b)); 

    Collections.sort(booklist, new Comparator<Book>() { 

     @Override 
     public int compare(Book o1, Book o2) { 

      return o2.getPrice() - o1.getPrice(); 
     } 
    }); 
    if (booklist.size() > 1) { 
     System.out.println(booklist.get(1)); 
    } 
+0

여기에 코너 케이스를 추가하는 것은 어떻습니까? 예를 들어 2 권 미만입니까? – shlomi33

+0

두 번째로 큰 번호를 찾는 것처럼 구석은 중요하지 않습니다. 2의 경우에 이것 또는 그 것일 것입니다 –

+0

배열을 목록으로 변환 할 필요가 없습니다. 그냥'Arrays.sort'를 사용하십시오. –

1

이 배열을 반복하면 배열의 두 번째로 큰 요소 인 가장 큰 배열을 찾을 수 있습니다. 요소가 객체이기 때문에 getter 또는 변수가있는 요소에서 비교할 값을 객체에 public으로 가져와야합니다.

public int getSecondLargest(Object[] obj){ 
    int length = obj.length; 
    int largest = 0; 
    int secondLargest = 0; 
    for(int i = 0; i<length; i++){ 
     if(obj[largest].getValue() <= obj[i].getValue()){ 
      secondLargest = largest; 
      largst = i; 
     } 
    } 

    return secondLargest; 
} 
2

Comparator을 구현하고 배열을 정렬 한 다음 두 번째 요소를 선택하십시오.

class BookPriceComparator implements Comparator<Book> { 
    @Override 
    public int compare(Book a, Book b) { 
     return a.getPrice() - b.getPrice(); 
    } 
} 

Arrays.sort(bookArr, new BookPriceComparator()); 
+0

+1은 Arrays.sort를 알기 때문에 +1했습니다. 이것이 최고의 대답입니다. –

1
  1. 난 당신이 Collections.sort();을 사용하여 다음 인터페이스를 Comparable.
  2. 를 구현해야한다고 생각
+0

답변에 대한 설명을 추가하십시오. 당신의 답을 더 잘 이해하는데 도움이 될 것입니다. –

1
import java.util.*; 

//here you can make changes or you can create your own new class 
//to sort book according to pages 
class sortPrice implements Comparator<Test> { 

public int compare(Test i1, Test i2) { 

Integer x = i1.getPrice(), y = i2.getPrice(); 

return y.compareTo(x); // <--- changed 

} 

} 

// in your case Test class could be Book class 
public class Test { 

    /** 
    * @param args 
    */ 

    int price , page ; 
    String name; 


    Test(String n , int p ,int pg){ 
     name=n; 
     price=p; 
     page=pg; 
    } 

    public String toString(){ 

     return name+" "+price +" "+page ; 
    } 

    public String getName(){ 
     return name; 
    } 

    public int getPage(){ 
     return page; 
    } 

    public int getPrice(){ 
     return price; 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Test[] b=new Test[3]; 
     b[0]=new Test("x",200,50); 
     b[1]=new Test("y",100,44); 
     b[2]=new Test("z",500,29); 

     ArrayList<Test> a = new ArrayList<>(); 

     for(int i=0;i<3;i++){ 
      a.add(b[i]); 
     } 
     sortPrice s= new sortPrice(); // required to pass as argument to tell 
             //based on which sorting order you want to sort 
     Collections.sort(a,s); //here we are sorting Test(Book) based on price.  
     System.out.println(a.get(1)); // printing arrayList //<----- changed 
    } 

} 
관련 문제