Почему System.out не возвращает нулевой объект? [Дубликат]

Вариант 1

Используйте df.merge

out = df1.merge(df2, left_on='store', right_on='store_code')\
                       [['id', 'store', 'address', 'warehouse']]
print(out)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

Вариант 2

Используя pd.concat и df.sort_values

out = pd.concat([df1.sort_values('store'),\
       df2.sort_values('store_code')[['warehouse']].reset_index(drop=1)], 1)
print(out)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

Первый вызов сортировки избыточен, если ваш фреймворк уже отсортирован на store, и в этом случае вы можете его удалить.


Вариант 3

Использование df.replace

s = df1.store.replace(df2.set_index('store_code')['warehouse'])
print(s) 
0    Land
1     Sea
2    Land
3    Land
4     Sea

df1['warehouse'] = s
print(df1)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

Альтернативно, создайте отображение явно. Это работает, если вы хотите использовать его позже.

mapping = dict(df2[['store_code', 'warehouse']].values) # separate step
df1['warehouse'] = df1.store.replace(mapping) # df1.store.map(mapping)
print(df1)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea
17
задан srk 26 February 2012 в 19:25
поделиться

10 ответов

System.out инициализируется null при создании экземпляра класса. Это задается методом nullPrintStream() в System.java, который просто возвращает null.

Когда JVM инициализируется, он вызывает метод initializeSystemClass(). Этот метод вызывает метод native setOut0(), который устанавливает переменную out в соответствующее значение.

Это может показаться странным, но это необходимая операция по следующим причинам:

  • out не может быть установлен статически на значение, потому что System должен быть одним из первых загруженных классов (до PrintStream).
  • out должен быть final, так что его значение не может быть напрямую переопределено пользователем.
  • Поскольку out нельзя установить статически и является окончательным, мы должны переопределить семантика языка с использованием метода native, setOut0().

Надеюсь, это поможет вам понять.

20
ответ дан Jivings 28 August 2018 в 07:40
поделиться

System.out является нормальным статическим атрибутом, он был установлен JVM через метод initializeSystemClass() во время инициализации JVM. Вы можете даже изменить его (хотя это не рекомендуется), просто называя System.setOut(printOutStream);, где printOutStream - это поток, который вы хотите использовать в качестве стандартного вывода.

Вот хороший article подробно описано, как работает System.out.println ().

6
ответ дан Óscar López 28 August 2018 в 07:40
поделиться

out - объект класса PrintStream, определенный в классе System. out объявлен как открытый, статический и окончательный.

  • println () - метод класса PrintStream.
  • Вызывается метод println () с внешним объектом.
  • Объект out вызывается с классом System.
0
ответ дан kavigun 28 August 2018 в 07:40
поделиться

System.out.println () -

Учитывая это, давайте разберем это, начиная с оператора точки. В Java оператор точки может использоваться только для вызова методов и переменных, поэтому мы знаем, что 'out' должен быть либо методом, либо переменной. Теперь, как мы классифицируем «выход»? Ну, «выход» не мог быть методом из-за того, что скобок нет («) (после), что означает, что это явно не метод, который вызывается. И «out» не принимает никаких аргументов, потому что только методы принимают аргументы - вы никогда не увидите что-то вроде «System.out (2,3) .println». Это означает, что «выход» должен быть переменной.

'out' вызывается с именем самого класса System, а не экземпляром класса (объекта), тогда мы знаем, что 'out' должен быть статической переменной, поскольку только статическая переменные могут вызываться только с именем класса. Итак, теперь мы знаем, что «out» - это статическая членная переменная, принадлежащая классу System.

Заметив тот факт, что 'println ()' явно является методом, мы можем далее классифицировать 'out' в System .out.println (). Мы уже рассудили, что «out» - статическая переменная, принадлежащая классу System. Но теперь мы можем видеть, что «выход» должен быть экземпляром класса, потому что он вызывает метод «println ()».

Процесс мысли, который следует использовать для получения ответа, преднамеренно проиллюстрировано выше. Не зная точного ответа заранее, вы можете приблизиться к нему, применив некоторые базовые знания Java. Большинство интервьюеров не ожидали, что вы узнаете, как System.out.println () работает сверху, но скорее увидит, что вы используете свои базовые знания Java, чтобы получить ответ, близкий к точному.

Более точный ответ на исходный вопрос таков: внутри класса System это объявление «out», которое выглядит так: «public static final PrintStream out», а внутри класса Prinstream - это объявление «println ()», который имеет подпись метода, которая выглядит так: «public void println ()».

Вот как выглядят разные фрагменты System.out.println ():

//the System class belongs to java.lang package

class System {
  public static final PrintStream out;
  //...
}

//the Prinstream class belongs to java.io package
class PrintStream{
public void println();
//...
}
4
ответ дан Krishnakant Kadam 28 August 2018 в 07:40
поделиться

В библиотеках времени исполнения Oracle Java он создается изначально с использованием нативного метода registerNatives(), который вызывается (через инициализатор static) при загрузке класса System. Это, однако, деталь реализации.

Вы также можете установить System.out напрямую, используя System.setOut().

0
ответ дан Mark Peters 28 August 2018 в 07:40
поделиться

Когда инициализируется системный класс, он вызывает свой метод initializeSystemClass(), вот код:

FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));

В этом коде setOut0() есть встроенная функция, реализованная в System.c:

JNIEXPORT void JNICALL
Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream)
{
    jfieldID fid =
        (*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");
    if (fid == 0)
        return;
    (*env)->SetStaticObjectField(env,cla,fid,stream);
}

Это стандартный JNI-код, который устанавливает System.out в переданный ему аргумент, этот метод вызывает собственный метод setOut0 (), который устанавливает переменную out в соответствующее значение.

System.out является окончательным, это означает, что в initializeSystemClass () не может быть установлено что-то еще, но с использованием собственного кода можно изменить конечную переменную.

0
ответ дан Mohit Tyagi 28 August 2018 в 07:40
поделиться

System.out предоставляется JVM. К моменту вызова вашего основного метода System.out открыт и готов к использованию.

См. http://docs.oracle.com/javase/1.5.0/docs/api/ Java / языки / System.html # из

0
ответ дан Peter Cetinski 28 August 2018 в 07:40
поделиться

Out in System.out.pritln - это статическое поле (объект) PrintWriter в классе System, а println - метод PrintWriter.

Ссылка: System: http: // docs. oracle.com/javase/6/docs/api/java/lang/System.html PrintWriter: http://docs.oracle.com/javase/6/docs/api/java/io/ PrintWriter.html

0
ответ дан Pinkesh Sharma 28 August 2018 в 07:40
поделиться

System.out.println ();

здесь println является объектом класса printstream. Мы не можем напрямую создавать объект для класса printstream. Out - объект системного класса. out называется полем в системном классе. при вызове system.out он косвенно создает объект для класса printstream. поэтому мы можем вызвать метод println (), используя System.out.prontln ().

-7
ответ дан surendar 28 August 2018 в 07:40
поделиться

Нет необходимости идти на чистую и документацию. Мы можем просто сказать javap java.lang.System, это дает вам список всех статических полей, прототипов методов, принадлежащих классу System. Мы можем получить информацию о любом классе java с помощью javap, если вы знаете, что его пакет и имя класса являются общедоступным статическим объектом PrintStream, определенным в классе System.

0
ответ дан user3282701 28 August 2018 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: