Изменение кода массива на векторный

#java #arrays #vector

#java #массивы #векторный

Вопрос:

Итак, я пытался просмотреть все, но, похоже, не могу найти много информации о том, что именно нужно изменить, чтобы преобразовать массив в векторный. Или, скорее, я полагаю, я просто не знаю, что именно искать.

Массив — это:

 public class Member{

 private int id;
 private String name;
 private String[] books = new String[5];
 //replace the String books array with a Vector variable named books
 //that functions exactly the same way 

 public Member() {
     id = 0;
     name = "John Doe";
 }

 public Member(int pId, String pName) {
     id = pId;
     name = pName;
 }

 public int getId(){
     return id;
 }

 public void setId(int pId){
     id=pId;
 }

 public String getName(){
     return name;
 }

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

 public String[] getBooks(){
     return books;
 }

 public void setBooks(String[] pBooks){
     books=pBooks;
 }

 public String toString(){
     StringBuffer buf = new StringBuffer();
     buf.append("ID: "   getId()   "  Member: "   getName()   "n");
     for(int x=0; x<books.length; x   ) {
         buf.append("Book: "   books[x]   "n");
     }
     return buf.toString();
 }


/**
 * @param args
 */
public static void main(String[] args) {
    String[] list = {"Java Data Structures", "The Bible", "Grapes of Wrath",
                    "Goldfinger", "Sam I Am", "The Cat in the Hat", "Shawshenk Redemption",
                    "Green Eggs and Ham", "Linus and Lucy", "Abraham Lincoln"};

    Member m1 = new Member();
    m1.setId(431);
    m1.setName("William Wallace");      
    for(int i=0; i<5; i  ) {
        m1.books[i] = list[i]; 
    }

    Member m2 = new Member(7010, "Bonny Clyde");
    for(int i=5; i<list.length; i  ) {
        int x = i-5;
        m2.books[x] = list[i]; 
    }

    System.out.println(m1.toString());
    System.out.println();
    System.out.println(m2.toString());
}

}
  

Сейчас я пытаюсь преобразовать его, но, честно говоря, я не знаю, что я делаю.

 import java.util.Vector;

public class Member{

 private int id;
 private String name;
 private Vector<String> books = new Vector<String>(5);
 //replace the String books array with a Vector variable named books
 //that functions exactly the same way

 public Member() {
     id = 0;
     name = "John Doe";
 }

 public Member(int pId, String pName) {
     id = pId;
     name = pName;
 }

 public int getId(){
     return id;
 }

 public void setId(int pId){
     id=pId;
 }

 public String getName(){
     return name;
 }

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

 public String getBooks(){
     return books;
 }

 public void setBooks(String pBooks){
     books=pBooks;
 }

 public String toString(){
     StringBuffer buf = new StringBuffer();
     buf.append("ID: "   getId()   "  Member: "   getName()   "n");
     for(int x=0; x<books.length; x   ) {
         buf.append("Book: "   books<x>   "n");
     }
     return buf.toString();
 }


/**
 * @param args
 */
public static void main(String args) {
    String list = {"Java Data Structures", "The Bible", "Grapes of Wrath",
                    "Goldfinger", "Sam I Am", "The Cat in the Hat", "Shawshenk Redemption",
                    "Green Eggs and Ham", "Linus and Lucy", "Abraham Lincoln"};

    Member m1 = new Member();
    m1.setId(431);
    m1.setName("William Wallace");
    for(int i=0; i<5; i  ) {
        m1.books<i> = list<i>;
    }

    Member m2 = new Member(7010, "Bonny Clyde");
    for(int i=5; i<list.length; i  ) {
        int x = i-5;
        m2.books<x> = list<i>;
    }

    System.out.println(m1.toString());
    System.out.println();
    System.out.println(m2.toString());
}

}
  

Любая помощь была бы высоко оценена.

Комментарии:

1. Vector действительно устарел. Я предлагаю вместо этого использовать ArrayList. В любом случае, у вас, очевидно, много ошибок компиляции. Вы читали руководство по использованию коллекций? Вы пробовали просматривать каждую из своих ошибок компиляции?

Ответ №1:

Вы можете упаковать свой массив в вектор таким образом:

 Vector<String> v = new Vector<String>(Arrays.asList(myList))
  

и тогда ваш цикл становится

 for (String s : v) {
  ...
}
  

Я бы использовал ArrayList over Vector , если только у вас нет веских причин для использования Vector .

Комментарии:

1. Хороший ответ, но я бы просто использовал Arrays.asList(somearray) напрямую. Обычно обертывание его с помощью arraylist не дает вам многого. Единственная по-настоящему интересная вещь заключается в том, что arraylist может быть изменен, а список из asList () — нет (потому что он поддерживается самим массивом).

2. @Джефф, я согласен, что простая оболочка — это правильный путь, если вы согласны возвращать неизменяемый список. Я заключил это в Vector , потому что это был первоначальный вопрос. Кроме того, преобразование массива в ArrayList или Vector может помочь двумя способами: защитное копирование, клиенты могут изменять его, не путаясь в исходном массиве; и поддержка мутации, в частности remove() и add() .

Ответ №2:

Вот ваш пример использования вектора. Я бы настоятельно рекомендовал использовать класс ArrayList, хотя, поскольку Vector больше не используется.

 import java.util.Vector;

public class Member{

 private int id;
 private String name;
 private Vector<String> books = new Vector<String>();
 //replace the String books array with a Vector variable named books
 //that functions exactly the same way

 public Member() {
     id = 0;
     name = "John Doe";
 }

 public Member(int pId, String pName) {
     id = pId;
     name = pName;
 }

 public int getId(){
     return id;
 }

 public void setId(int pId){
     id=pId;
 }

 public String getName(){
     return name;
 }

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

 public Vector<String> getBooks(){
     return books;
 }

 public void add(String book) {
    books.add(book);
 }


 public void setBooks(Vector<String> pBooks){
     books=pBooks;
 }

 public String toString(){
     StringBuffer buf = new StringBuffer();
     buf.append("ID: "   getId()   "  Member: "   getName()   "n");
     for(int x=0; x<books.size(); x   ) {
         buf.append("Book: "   books.get(x)   "n");
     }
     return buf.toString();
 }


/**
 * @param args
 */
public static void main(String[] args) {
    String[] list = new String[]{"Java Data Structures", "The Bible", "Grapes of Wrath",
                    "Goldfinger", "Sam I Am", "The Cat in the Hat", "Shawshenk Redemption",
                    "Green Eggs and Ham", "Linus and Lucy", "Abraham Lincoln"};

    Member m1 = new Member();
    m1.setId(431);
    m1.setName("William Wallace");
    for(int i=0; i<5; i  ) {
        m1.add(list[i]);
    }

    Member m2 = new Member(7010, "Bonny Clyde");
    for(int i=5; i<list.length; i  ) {
        int x = i-5;
        m2.add(list[x]);
    }

    System.out.println(m1.toString());
    System.out.println();
    System.out.println(m2.toString());
}

}
  

Комментарии:

1. Вам следует избавиться от венгерской нотации, к которой в Java относятся неодобрительно. Также вы могли бы рассмотреть возможность изменения типа get / setBooks на List вместо Vector . Всегда лучше программировать для интерфейса, чем для конкретного класса.

2. Я согласен с обоими пунктами. Однако я не хотел переписывать его код, кроме как для решения вопроса, который он задавал.

3. Я должен также отметить, что, исходя из характера его вопроса, он явно новичок в Java, и я не хотел еще больше запутывать дело, поэтому я предложил использовать ArrayList и не вдаваться в предложения по программированию интерфейсов.

Ответ №3:

Вы можете использовать Arrays.asList для преобразования массива в список. Вектор — это список, но я подозреваю, что все, что вам нужно, это список. Хорошей идеей является программирование в интерфейсе List, а не в конкретном классе, таком как Vector.

 List<String> list = Arrays.asList(array)
  

Ответ №4:

Алекс, если вашему коду не обязательно быть безопасным в многопоточной среде, как все предлагали, вам следует использовать ArrayList.

В случае, если у вас есть параллельные операции, вы можете захотеть взглянуть на Collections.synchronizedList . Однако проверьте некоторые ограничения использования этого, как указано здесь

Наконец, есть некоторые ситуации, когда вектор необходим. Там я бы рекомендовал Vector<String> v = new Vector<String>(Arrays.asList(myList)) то, что было предложено Майком ранее.