Каков составляет 1$ в именах файлов класса?

Запуск с Python 2.6 (и если Вы находитесь на Python 3) Вы имеете стандартная библиотека инструмент для этого: itertools.permutations .

import itertools
list(itertools.permutations([1, 2, 3]))

, Если Вы используете более старый Python (< 2.6) по некоторым причинам или просто любопытны знать, как это работает, вот один хороший подход, проявленный от http://code.activestate.com/recipes/252178/ :

def all_perms(elements):
    if len(elements) <=1:
        yield elements
    else:
        for perm in all_perms(elements[1:]):
            for i in range(len(elements)):
                # nb elements[0:1] works in both string and list contexts
                yield perm[:i] + elements[0:1] + perm[i:]

Несколько альтернативных подходов перечислены в документации itertools.permutations. Вот тот:

def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = range(n)
    cycles = range(n, n-r, -1)
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

И другой, на основе itertools.product:

def permutations(iterable, r=None):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    for indices in product(range(n), repeat=r):
        if len(set(indices)) == r:
            yield tuple(pool[i] for i in indices)

59
задан Matthias Braun 23 January 2018 в 11:15
поделиться

5 ответов

$ 1 - это анонимные внутренние классы, которые вы определили в своем файле WelcomeApplet.java .

например, компиляция

public class Run {
    public static void main(String[] args) {
        System.out.println(new Object() {
            public String toString() {
                return "77";
            }
        });
    }
    private class innerNamed {
    }
}

приведет к Run.class ], Выполните $ 1.class и Выполните создаваемый $ innerNamed.class

27
ответ дан 24 November 2019 в 18:25
поделиться

Это файлы .class , которые содержат анонимные внутренние классы .

В вашем примере WelcomeApplet.java содержит класс верхнего уровня (называемый WelcomeApplet ) и анонимный внутренний класс, который будет храниться в WelcomeApplet $ 1.class .

Обратите внимание, что точное имя файлов, содержащих анонимные внутренние классы не стандартизированы и могут отличаться. Но на практике я еще не видел никакой другой схемы, кроме описанной здесь.

Тела, зависящие от значений для перечисления , также являются анонимными внутренними классами :

Необязательное тело класса константы enum неявно определяет объявление анонимного класса ( §15.9.5 ), которое расширяет непосредственно включающий тип enum.

5
ответ дан 24 November 2019 в 18:25
поделиться

Это из этой «строки» кода:

return new
    ActionListener()
    {
        public void actionPerformed(ActionEvent event)
        {
            try
            {
                getAppletContext().showDocument(new URL(u));
            }
            catch(MalformedURLException e) 
            { 
                e.printStackTrace(); 
            }
        }
    };

Как вы объявляете ActionListener , вы создаете экземпляр анонимного внутреннего класса каждый раз, когда этот метод вызывается.

Даже если метод не вызывается, указанная выше строка все равно компилируется в анонимный внутренний класс, несмотря ни на что.

2
ответ дан 24 November 2019 в 18:25
поделиться

The WelcomeApplet$1.class file is generated for an anonymous class in the WelcomeApplet.java source (the anonymous class is generated in the method call makeURLActionListener by calling new new ActionListener() {...})

To explain more clearly, the anonymous classes are generated at compile time any time you have an instantiation of a concrete named class that overrides some or all of the behavior of the concrete class (or interface) inline like this:

class HelloInternalClass {
  public static final void main(String[] args) {
    // print in another thread
    new Thread(new Runnable() {
      public void run() {
        System.out.println("Printed from another thread");
      }
    }).start();
  }
}

In the above sample code, the javac compiler would generate 2 class files just like in your example: HelloInternalClass.class and HelloInternalClass$1.class.

The anonymous class in this instance would be a subclass of Runnable and would be compiled into HelloInternalClass$1.class. Incidentally, if you would ask a class name from the runnable instance in the above sample (by calling getClass().getName()) you would find that it thinks of itself as "HelloInternalClass$1".

1
ответ дан 24 November 2019 в 18:25
поделиться

Это файлы .class которые содержат анонимные внутренние классы .

В вашем примере WelcomeApplet.java содержит класс верхнего уровня (называемый WelcomeApplet ) и анонимный внутренний класс, который будет храниться в WelcomeApplet $ 1.class .

Обратите внимание, что точное имя файлов, содержащих анонимные внутренние классы, не стандартизировано и может отличаться. Но на практике я еще не видел никакой другой схемы, кроме описанной здесь.

Тела, зависящие от значений для перечисления , также являются анонимными внутренними классами :

Необязательное тело класса константы перечисления неявно определяет объявление анонимного класса ( §15.9.5 ), которое расширяет непосредственно включающий тип перечисления.

63
ответ дан 24 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

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