2010-02-13 15 views
5

के साथ हैश मैप का उपयोग कैसे करें मेरे पास हैश मैप है जो मैं अपने डेटा को जेटीबल में देखना चाहता हूं कि मुझे हैश मैप कॉलम और पंक्तियों और डेटा प्रदर्शित होने में परेशानी हो रही है। मेरे पास हैशपैप है जो एक खाता आईडी को कुंजी और छात्रों की एक वस्तु के रूप में लेता है जिसमें प्रत्येक छात्र के पास नाम, आईडी, आयु इत्यादि जैसे डेटा होते हैं। यहां तक ​​कि जेटीबल डॉक्स का जिक्र करते हुए, यह कहता है कि मुझे पंक्ति और कॉलम और एक बहुआयामी सरणी के लिए स्याही की आवश्यकता होगी ऑब्जेक्ट टाइप करें। मैं यह कैसे कर सकता हूं? क्या मैं अपने हैशमैप को एक मल्टीडिमेनियन सरणी में बदल सकता हूं?जेटीबल

- संपादित करें मैंने अपना प्रश्न संपादित किया है, इसलिए यह और स्पष्ट हो सकता है, मैं जावा के लिए बिल्कुल नया हूं, मुझे वास्तव में कुछ नहीं मिला है, विशेष रूप से जब से मैं जो काम कर रहा हूं वह ओओ से काफी संबंधित है और ओओ अवधारणाओं को समझना मेरी सबसे बड़ी चुनौती है,

/मेरे पास डेटा स्टोरेज क्लास है, पंजीकृत उपयोगकर्ता हैशैप में अपने उपयोगकर्ता नाम के एक महत्वपूर्ण इनपुट के साथ जोड़ा गया है, जो getUser है।/

import java.util.*; 

public class DataStorage 
{ 
    HashMap<String, Student> students = new HashMap<String, Student>(); 
    HashMap<String, Staff> staffMembers = new HashMap<String, Staff>(); 
    //Default constructor 
    public DataStorage(){ 
    } 

    public void addStaffMember(Staff aAcc) 
    { 
    staffMembers.put(aAcc.getUser(),aAcc); 
    } 

    public void addStudentMember(Student aAcc) 
    { 
    students.put(aAcc.getUser(),aAcc); 
    } 

    public Staff getStaffMember(String user) 
    { 
    return staffMembers.get(user); 
    } 

    public Student getStudent(String user) 
    { 
    return students.get(user); 
    } 

    public int getStudentRows() 
    { 
     return students.size(); 
    } 


} 

/**** यह एक छात्र वर्ग जो खाता ***/फैली

public class Student extends Account { 

    private String studentNRIC; 
    private String diploma; 
    private String gender; 
    private double level; 
    private int credits; 
    private int age; 
    private boolean partTime; 
    private boolean havePc; 
    private boolean haveChild; 

    public Student(String n, String nr, String id, String dep, String user, String pass) 
    { 
     super(n, dep, user, pass, id); 
     studentNRIC = nr; 
    } 

    public void setPartTime(boolean state) 
    { 
     if(state == true) 
     { 
      partTime = true; 
     } 
     else 
     { 
      partTime = false; 
     } 
    } 

    public boolean getPartTime() 
    { 
     return partTime; 
    } 

    public void setHavePc(boolean state) 
    { 
     if(state == true) 
     { 
      havePc = true; 
     } 
     else 
     { 
      havePc = false; 
     } 
    } 

    public boolean getHavePc() 
    { 
     return havePc; 
    } 

    public void setHaveChild(boolean state) 
    { 
     if(state == true) 
     { 
      haveChild = true; 
     } 
     else 
     { 
      haveChild = false; 
     } 
    } 

    public boolean getHaveChild() 
    { 
     return haveChild; 
    } 
    public void setDiploma(String dip) 
    { 
     diploma = dip; 
    } 

    public String getDiploma() 
    { 
     return diploma; 
    } 

    public void setCredits(String cre) 
    { 
     credits = Integer.parseInt(cre); 
    } 

    public int getCredits() 
    { 
     return credits; 
    } 

    public void setGender(String g) 
    { 
     gender = g; 
    } 

    public String getGender() 
    { 
     return gender; 
    } 

    public void setAge(String a) 
    { 
     age = Integer.parseInt(a); 
    } 

    public int getAge() 
    { 
     return age; 
    } 
    public void setLevel(String lvl) 
    { 
     level = Double.parseDouble(lvl); 
    } 

    public double getLevel() 
    { 
     return level; 
    } 
    public void setStudentNRIC(String nr) 
    { 
     studentNRIC = nr; 
    } 

    public String getStudentNRIC() 
    { 
     return studentNRIC; 
    } 

} 

/**** यह एक खाता सुपर क्लास ***/

है
public class Account { 

    private String name; 
    private String department; 
    private String username; 
    private String password; 
    private String accountID; 
    public Account() 
    { 
    } 
    public Account(String nm,String dep,String user,String pass, String accID) 
    { 
     name = nm; 
     department = dep; 
     username = user; 
     password = pass; 
     accountID = accID; 

    } 

    public void setName(String nm) 
    { 
     name = nm; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setDep(String d) 
    { 
     department = d; 
    } 

    public String getDep() 
    { 
     return department; 
    } 

    public void setUser(String u) 
    { 
     username = u; 
    } 
    public String getUser() 
    { 
     return username; 
    } 

    public void setPass(String p) 
    { 
     password = p; 
    } 

    public String getPass() 
    { 
     return password; 
    } 

    public void setAccID(String a) 
    { 
     accountID = a; 
    } 

    public String getAccID() 
    { 
     return accountID; 
    } 
} 
+0

'सार सारणी मॉडल' को विस्तारित करने वाला एक पूर्ण उदाहरण दिखाया गया है [यहां] (http://stackoverflow.com/a/9134371/230513)। – trashgod

उत्तर

3

क्यों नहीं एक वस्तु है कि फैशन कि JTable इच्छाओं (एक Object सरणी) में एक अंतरफलक को लागू करता है, और छात्रों के अपने मौजूदा नक्शे के लिए एक पुल प्रदान करता है बनाने के? तो आप अपनी मौजूदा डेटा संरचना को रख सकते हैं जो स्पष्ट रूप से आपके लिए काम कर रहा है, और आप दृश्य (जेटीबल) के लाभ के लिए बस adaptor प्रदान कर रहे हैं।

लिंक से:

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

मैं नहीं की कोशिश करेगा को कार्यरत डेटा संरचना को बदलने के लिए एक विशेष जीयूआई घटक (बाद में यदि आप HTML या इसके जैसा माध्यम से प्रदर्शित करना चाहते हैं कि क्या होता है) के साथ फिट करने के लिए, लेकिन एक आवश्यकता के रूप में प्रत्येक दृश्य के लिए अनुकूल आता है।

+0

अच्छा जवाब ब्रायन, लेकिन चूंकि यह होमवर्क है शायद यह बहुत जटिल है। शुरू करने के लिए उसे कुछ कोड दें और मैं आपकी पोस्ट को एक अपवित्र के साथ भर दूंगा :) – willcodejavaforfood

+0

@ विल्लकोडावाफॉर्फूड - हाँ। मैंने सोचा कि मैं प्रश्न * प्रति से * का जवाब नहीं दे रहा था, जो कि क्या हो रहा है के बारे में एक उच्च विचार प्रदान करने के रूप में। मैंने आपके उत्तर को +1 किया है क्योंकि आपने कोड लिखा है और मुझे इसे डुप्लिकेट करने में कोई बिंदु नहीं दिख रहा है :-) –

+0

चीयर्स दोस्त। मुझे आपके उत्तरों में से एक और उत्तर मिल जाएगा जो कि इसके बजाय :) – willcodejavaforfood

7

आपके पास यहां कई विकल्प उपलब्ध हैं। मैं शायद अपना खुद का TableModel बनाउंगा और HashMap को एक सूची में परिवर्तित कर दूंगा, लेकिन इसके लिए accountID छात्र का हिस्सा था और मैं यह नहीं बता सकता कि यह आपकी पोस्ट से है या नहीं। तो एक बहु आयामी सरणी बनाने के लिए शायद आसान है। ऐसा करने के लिए आपको अपने HashMap में प्रत्येक ऑब्जेक्ट की जांच करने की आवश्यकता है और ऐसा करने के लिए हम 'लूप' का उपयोग करेंगे।

सबसे पहले अपने डेटा रखने के लिए सारिणी निर्मित:

Object[][] tableData = new Object[students.keySet().size()][numberOfColumns]; 

कॉलम आपकी टेबल है की संख्या के साथ numberOfColumns बदलें।

int index = 0; 
for (String key : students.keySet()) 
{ 
    Student student = students.get(key); 
    tableData[index][0] = student.getXXX 
    tableData[index][1] = student.getYYY 
    tableData[index][2] = student.getZZZ 
    // and so forth 
    index++; 
} 

तो क्या हम यहाँ करने के एक पाश है कि छात्रों को HashMap में और उस कुंजी के साथ हर कुंजी हम छात्र वस्तु प्राप्त करने, जांच और सही डेटा के साथ सरणी से स्थापित हो जाएगा पैदा करते हैं।

यह आपके प्रश्न का उत्तर देना है, लेकिन मैं अनुशंसा करता हूं कि आप टेबलमोडेल इंटरफ़ेस पर नज़र डालें और छात्रों के अपने हैश मैप के आसपास एक बनाएं। अधिक मैनली :)

+0

हैलो, हाँ छात्रों के पास खाता आईडी – sutoL

+0

तक पहुंच है एक पूर्ण उदाहरण जो 'सारटेबल मॉडेल' को विस्तारित करता है [यहां] (http://stackoverflow.com/a/9134371/230513) – trashgod

2

ऐसा करने का तरीका छात्र पंजीकरण (उर्फ सॉर्टेडमैप) के लिए TableModel इंटरफेस को कार्यान्वित करके है। TableModel टेबल मॉडल का प्रतिनिधित्व है कि स्विंग जेटीबल अपने डेटा की अपेक्षा कैसे करता है। TableModel इंटरफ़ेस, उस डेटा को प्रदान करने की पूर्ण लचीलापन देता है।

एक बार है कि कार्यान्वयन बनाया जाता है, एक JTable बनाने सीधे पर है:

// As StudentRegistration class 
new JTable(new StudentTableModel(studentRegistration)); 
// Or as SortedMap<String, Student> 
new JTable(new StudentTableModel(students)); 

इस परिदृश्य में मैं उम्मीद करते हैं कि सादा SortedMap<String, Student> सीधे नहीं दिया जाता है, लेकिन StudentRegistration का एक उदाहरण है, जो एक SortedMap<String, Student> ऐसे ही होता है ।

/** 
* Models the {@link Student} entries as a Swing TableModel. 
*/ 
final public class StudentTableModel implements TableModel { 
    /** The TableModel column names. */ 
    public final String columnNames[] = 
      new String[] { 
       "Name", "Identification", "Age" 
      }; 
    /** The list of TableModelListeners. */ 
    private final ArrayList<TableModelListener> tableModelListenerList = new ArrayList<TableModelListener>(); 
    /** The manager containing all the Student instances. */ 
    private final StudentRegistration register; 


    public StudentTableModel(StudentRegistration register) { 
     super(); 
     this.register = register; 
    } 


    public Class<?> getColumnClass(int columnIndex) { 
     return null; 
    } 


    public int getColumnCount() { 
     return columnNames.length; 
    } 

    public String getColumnName(int columnIndex) { 
     return (columnIndex < columnNames.length) ? columnNames[columnIndex] : null; 
    } 

    public int getRowCount() { 
     return register.getStudents().size(); 
    } 


    public Object getValueAt(int rowIndex, int columnIndex) { 
     // One solution 
     String identification = register.getStudentIds().toArray()[rowIndex]; 
     Student student = register.getStudent(identification); 
     // Other option 
     SortedMap<String, Student> studentMap = register.getStudents(); 
     String[] studentIdArray = studentMap.keySet().toArray(new String[studentMap.keySet().size()]); 
     Student student = studentMap.get(studentIdArray[rowIndex]); 
     final Object result; 
     switch (columnIndex) { 
      case 0: 
       result = student.getName(); 
       break; 
      case 1: 
       result = student.getIdentification(); 
       break; 
      case 2: 
       result = student.getAge(); 
       break; 
      default: 
       result = null; 
     } 
     return result; 
    } 


    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return false; 
    } 

    public void setValueAt(Object value, int rowIndex, int columnIndex) { 
     // Just ignore, model is read only. 
    } 


    public void addTableModelListener(TableModelListener tml) { 
     if (! tableModelListenerList.contains(tml)) { 
      tableModelListenerList.add(tml); 
     } 
    } 

    public void removeTableModelListener(TableModelListener tml) { 
     tableModelListenerList.remove(tml); 
    } 

} 

पीएस: यह नमूना कुछ अन्य कार्यान्वयन से आंशिक रूप से आता है, मैंने इसे ऊपर वर्णित अनुसार आपके परिदृश्य में अपडेट किया है। तो यह काफी संभव है कि इसमें कुछ कोड ग्लिट्ज शामिल हैं। यह आपको एक विचार देने के लिए प्रदान किया गया है कि समाधान कैसे दिख सकता है।

+0

आपके इनपुट के लिए धन्यवाद, हालांकि मुझे सबसे ज्यादा समझ में नहीं आता टेबल मॉडल इंटरफ़ेस के कुछ हिस्सों, मुझे माफ़ कर दो, मैंने केवल जावा शुरू किया है और ओओ अवधारणाओं को पकड़ना बहुत मुश्किल है। क्या मैं एक और विस्तृत पोस्ट पोस्ट कर सकता हूं ताकि आप मुझे सही दिशा में इंगित कर सकें – sutoL

+0

हाय, मैंने एक संलग्न किया है मेरे प्रश्न का दोबारा, मूल रूप से मेरे जीयूआई के पास एक पंजीकरण फॉर्म है, इसलिए पंजीकृत होने पर मैं डेटास्टोरस हैशप छात्र में जानकारी डालूंगा और उसके बाद एक कर्मचारी होगा लॉगिन करने और छात्र की जानकारी देखने के लिए भी होना चाहिए। और मैंने पढ़ा है कि एक जेटीबल का उपयोग डेटा प्रदर्शित करने के लिए किया जा सकता है, हालांकि इसे ऑब्जेक्ट्स के ऐरे की आवश्यकता है, लेकिन मैं हैश मैप का उपयोग कर रहा हूं, इसलिए मैं पूरी तरह से अटक गया हूं कि सूचनाओं को कैसे प्राप्त किया जाए। – sutoL

+0

'सारणीटेबल मॉडल' का विस्तार 'EventMistelListener' mutators के 'EventListenerList' के माध्यम से कार्यान्वयन प्रदान करता है; एक पूर्ण उदाहरण दिखाया गया है [यहां] (http://stackoverflow.com/a/9134371/230513)। – trashgod

0

आपका DataStorage नमूना कोड में StudentRegistration का उपयोग किया जाता है।

// TIP: It can be handy to place the student in some order in the Map 
    //  (therefore using the sorted map). 
    private SortedMap students = new TreeMap(); 
// QUESTION: Why not use argument name 'student'? 
    public void addStudentMember(Student aAcc) 
    { 
     students.put(aAcc.getUser(),aAcc); 
    } 
    // Updated implementation 
    public void addStudent(Student student) 
    { 
     students.put(student.getAccID(), student); 
    } 
// QUESTION: Would a method name 'getNumberOfStudents' not be better? 
    public int getStudentRows() 

मेरे लिए यह क्यों StudentAccount तक फैली हुई है एक छोटे से स्पष्ट नहीं है। खाता पहचान, क्या छेद प्रणाली के माध्यम से एक अद्वितीय आईडी है? क्या कर्मचारी (उपयोगकर्ता) और छात्र (उपयोगकर्ता) सभी के पास अद्वितीय पहचान है? कहां/कौन बनाता है? यदि सिस्टम स्वयं नहीं है, तो यह कभी भी गारंटी नहीं दी जा सकती है कि वे आपके सिस्टम में भी सही ढंग से प्रवेश करते हैं। यहां तक ​​कि जब आपके सिस्टम के भीतर विशिष्टता की जांच करते हैं, तो मदद करता है। लेकिन कौन किसी और को नहीं कहता है (accedent द्वारा) किसी और का इस्तेमाल उसकी अद्वितीय आईडी? (छात्र और कर्मचारी (खाते) कैसे बनाए जाते हैं? यदि ये आईडी वास्तव में अद्वितीय हैं, तो छात्र को सॉर्टेड मैप में रखने के लिए उन लोगों का उपयोग क्यों न करें? यदि सॉर्टिंग महत्वपूर्ण नहीं है। क्यों न केवल छात्रों की सूची का उपयोग करें?

नाम पैरामीटर अद्वितीय (जिसके द्वारा आप मानचित्र में छात्र जगह) है?

प्रोग्रामिंग छोटे से अधिक एक प्रोग्रामिंग भाषा सीखने तो है। के रूप में एक बार OO-भाषा जावा यह अच्छा है को समझने के लिए कुछ और सामान्य पढ़ने के लिए प्रोग्रामिंग किताबें। आपके विशिष्ट मामले में मैं Domain Driven Design से शुरू करूंगा। और फिर इन Test Driven Development, Refactoring to Patterns और Design Patterns जैसी पुस्तकों के साथ जारी रखें।

+0

खाता सुपरक्लास में नाम, आयु, लिंग जैसे सामान्य उदाहरण होते हैं, जिससे छात्र और कर्मचारी दोनों खाते बनाए जाते हैं, इसलिए मैंने उस खाते को बनाया है और कर्मचारियों और छात्र को – sutoL

+0

सार्वजनिक छात्रटेबल मॉडल (छात्र पंजीकरण पंजीकरण) { सुपर() ; this.register = रजिस्टर; } मुझे समझ में नहीं आता कि मुझे अपने डेटास्टॉरेज क्लास के निर्माता को कॉल क्यों चाहिए? मेरा डेटास्टॉरेज क्लास कन्स्ट्रक्टर शून्य – sutoL

+0

एमएम है, वहां नए छात्र पंजीकरण (...) (उर्फ डेटास्टॉरेज) की कोई कॉल नहीं है। उस उदाहरण का केवल एक संदर्भ आवश्यक है। – Verhagen

6
public class HashMapToJtable { 
public static void main(String[] args) { 
    final Map<String,String> st=new TreeMap<String, String>(); 
    st.put("1","one"); 
    st.put("2","two"); 
    st.put("3","three"); 
    JTable t=new JTable(toTableModel(st)); 
    JPanel p=new JPanel(); 
    p.add(t); 
    JFrame f=new JFrame(); 
    f.add(p); 
    f.setSize(200,200); 
    f.setVisible(true); 
} 
public static TableModel toTableModel(Map<?,?> map) { 
    DefaultTableModel model = new DefaultTableModel(
     new Object[] { "Key", "Value" }, 0 
    ); 
    for (Map.Entry<?,?> entry : map.entrySet()) { 
     model.addRow(new Object[] { entry.getKey(), entry.getValue() }); 
    } 
    return model; 
} 
} 

यह आपको अपने छात्र और स्टाफ की कक्षाओं में override the toString विधि करना होगा एक map.For उद्देश्य से एक JTable को आबाद करने के लिए एक नमूना कोड है।

2

एमिल के जवाब से बाहर निकलना, लेकिन पुराने संस्करण (जावा 1.3 के साथ परीक्षण) का समर्थन करना।

import javax.swing.*; 
import java.util.*; 
import javax.swing.table.*; 

public class HashMapToJtable { 
public static void main(String[] args) { 
    final Map st = new TreeMap(); 
    st.put("1","one"); 
    st.put("2","two"); 
    st.put("3","three"); 
    JTable t=new JTable(toTableModel(st)); 
    JPanel p=new JPanel(); 
    p.add(t); 
    JFrame f=new JFrame(); 
    f.add(p); 
    f.setSize(200,200); 
    f.setVisible(true); 
} 

public static TableModel toTableModel(Map map) { 
    DefaultTableModel model = new DefaultTableModel (
    new Object[] { "Key", "Value" }, 0 
); 
    for (Iterator it = map.entrySet().iterator(); it.hasNext();) { 
    Map.Entry entry = (Map.Entry)it.next(); 
    model.addRow(new Object[] { entry.getKey(), entry.getValue() }); 
    } 
    return model; 
} 

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