2011-01-22 22 views
5

मुझे लगता है कि में फंस कर रहा हूँ मैं एक वस्तु बुक कि तीन चरजावा परिसर छंटाई

String title 
int Year 
String authorName 

मिला मैं एक, दो या आरोही में चर के सभी तीन या अवरोही क्रम द्वारा पुस्तकों को सॉर्ट करना होगा, मैं कार्यान्वित टाइटल ऑर्डरिंग लेकिन मैं अटक गया हूं कि जब लोग एक से अधिक वैरिएबल ऑर्डर करने के लिए चुनते हैं तो क्या करना है।

बुक कक्षा::

import java.util.ArrayList; 


public class Book{ 

String title; 
String authorName; 
int editionYear; 

public Book(String title, String authorName, int editionYear){ 
    this.title = title; 
    this.authorName = authorName; 
    this.editionYear = editionYear; 

} 

public String getBookInfo(){ 

    ArrayList bookInfo = new ArrayList(); 
    bookInfo.add(this.title); 
    bookInfo.add(this.authorName); 
    bookInfo.add(this.editionYear); 
    return bookInfo.toString(); 
} 

} 

BookSorter कक्षा:

import java.util.Arrays; 
import java.util.Comparator; 

public class BookSorter{ 

private String sortkey; 
private String order; 
Book[] Books; 

public BookSorter(Book Book1, Book Book2, Book Book3, Book Book4){ 
    this.Books = new Book[] {Book1, Book2, Book3, Book4}; 
} 

public Book[] sortByTitle(boolean sortorder){ 
    Comparator<Book> byTitle = new TitleComparator(sortorder); 
    Arrays.sort(Books, byTitle); 
    for(int i=0;i<4;i++) System.out.println(Books[i].title); 
    return Books; 
} 
} 

TitleComparator:

import java.util.Comparator; 

class TitleComparator implements Comparator<Book> { 

boolean ascending; 

public TitleComparator(boolean ascending){ 
    this.ascending = ascending; 
} 

public int compare(Book Book1, Book Book2){ 
    if(ascending == true){ 
     if(Book1.title.compareToIgnoreCase(Book2.title) > 0) return 1; 
     else if(Book1.title.compareToIgnoreCase(Book2.title) < 0) return -1; 
     else return 0; 
    }else{ 
     if(Book2.title.compareToIgnoreCase(Book1.title) < 0) return -1; 
     else if(Book2.title.compareToIgnoreCase(Book1.title) > 0) return 1; 
     else return 0; 
    } 
} 
} 

मैं हालांकि मैं एक काम कर सकता था

यहाँ मेरी कोड के कुछ है थोड़ा मोर ई तुलनित्र पर लेकिन मैं वास्तव में ऐसी चीज को मॉडल करने के तरीके पर फंस गया हूं, अग्रिम धन्यवाद

+0

क्या यह होमवर्क है? यदि ऐसा है तो कृपया इसे इस तरह टैग करें। – CoolBeans

+0

यह कोई होमवर्क नहीं है, मैं मूल्यांकन के लिए अध्ययन कर रहा हूं; डी – bwagner

+0

@ कूलबीन: कृपया [मेटा टैगिंग का सुझाव न दें] (http://meta.stackexchange.com/questions/10811/how-to-ask-and -answer-होमवर्क-प्रश्न)। –

उत्तर

2

यह एक होमवर्क की तरह लगता है मुसीबत। तो मैं आपको कुछ संकेत प्रदान करने जा रहा हूं।

1. First see if Title1==Title2. 
    1.1 if YES then see if year1==year2 
      1.1.1 if YES then see if authorName1==authorName2 
       1.1.1.1 If YES then they are equal (return 0) 
       1.1.1.2 else if NO compare author1 and author2 (return 1 or -1) 
    1.2 else if NO then compare year1 and year2 (return 1 or -1) 
2. else if NO then compare title1 and title2 (return 1 or -1) 
+1

सबसे बड़ी समस्या यह है कि लोग कोई भी ऑर्डर चुन सकते हैं, वे लेखक आरोही, वर्ष अवरोही और फिर शीर्षक आरोही चुन सकते हैं, या दूसरी तरफ, प्रत्येक संभावना के लिए एक आईएफ श्रृंखला थोड़ा अधिक – bwagner

+0

देख सकते हैं जैसा मैंने कहा था कि मैं आपको दे रहा हूं एक से अधिक फ़ील्ड को सॉर्ट करने के तरीके पर मूल विचार। तो अपने प्रश्न का उत्तर देने के लिए आपको क्या करना चाहिए, प्रत्येक फ़ील्ड के लिए एक तुलना विधि है और उसके बाद उपयोगकर्ता चयनित आदेश के आधार पर उन्हें मुख्य तुलनित्र वर्ग में उस क्रम में कॉल करें। – CoolBeans

+0

उदाहरण के लिए एकाधिक तुलनित्रों को कैसे श्रृंखलाबद्ध करें ... इस लिंक पर एक नज़र डालें http://www.java2s.com/Code/Java/Collections- डेटा- संरचना/लिस्टैंडकंपर्स। एचटीएम। – CoolBeans

1

Group Comparator आपको कई गुणों को सॉर्ट करने की अनुमति देता है। आप Bean Comparator का भी उपयोग कर सकते हैं ताकि आपको कस्टम कंप्यूटर्स लिखना न पड़े।

2

आरोही/अवरोही को अधिक आसान कार्यान्वित किया जा सकता है, क्योंकि यह तुलना परिणाम की तुलना में सरल "इन्वर्टर" करता है। और तुम "का पुन: उपयोग" कर सकते हैं compareToIgnoreCase तरीकों से परिणाम:

public int compare(Book book1, Book book2) {  
    int result = book1.title.compareToIgnoreCase(book2.title); 
    return ascending ? result : result * -1; 
} 

अन्य comparators बहुत समान हैं (तुलना विधि के लिए नमूने सीमित):

public int compare(Book book1, Book book2) {  
    int result = book1.author.compareToIgnoreCase(book2.author); 
    return ascending ? result : result * -1; 
} 

public int compare(Book book1, Book book2) { 
    Integer year1 = book1.year; 
    Integer year2 = book2.year; 
    int result = year1.compareTo(year2); 
    return ascending ? result : result * -1; 
} 
+0

धन्यवाद, इसने कोड को बहुत साफ करने में मदद की – bwagner

+0

क्या मैं उन सभी तुलनित्रों को एक ही कक्षा में रख सकता हूं? – bwagner

2

लिखें 3 तुलनित्र वर्ग जो प्रत्येक एक विशिष्ट विशेषता की तुलना करते हैं और फिर एक समग्र तुलनित्र वर्ग जो तुलनित्रों की एक आदेशित सूची लेता है।

या org.apache.commons.collections.comparators.ComparatorChain जैसी लाइब्रेरी से कुछ सुविधा वर्ग का उपयोग करें।

संपादित करें:

ओपी पूछते हैं:

मैं कैसे लिख सकता है कि कुल मिलाकर तुलनित्र:

कुछ की तरह:

// private List<Comparator<?>> comparators; // initialized in constructor 

// compare method(book1, book2): 
//  note that while result == 0, books have had equal attributes so far 
//  once result is != 0, the books are now ordered - no need to compare further 
//  if we run out of comparators and result still == 0, books are equal. 

//  initialize iterator to list of comparators 
//  int result = 0; 
//  while result == 0 && still more comparators 
//   get current comparator from iterator 
//   result = comparator.compare(book1, book2); // compare current attribute 
//  end-while 
//  return result 
+0

पिछले तुलनाकर्ताओं में किए गए आदेश को संरक्षित करने के लिए, मैं उस समग्र तुलनित्र को कैसे लिख सकता हूं? – bwagner

+0

@bwgpro - संपादित करें –

+0

मैं जावा का उपयोग करके सहज नहीं हूं, मैं अपने प्रोग्राम में अपाचे सामान्य तुलनित्र श्रृंखला कैसे जोड़ूं? – bwagner

संबंधित मुद्दे